{
  "schema_version": 1,
  "generated_at": "2026-10-22T21:51:48.206859+00:00",
  "git_sha": "0ab4d5a",
  "dirty": false,
  "status": "v3",
  "env": {
    "python": "3.14.7",
    "postgres": "16.13",
    "hypothesis_profile": "ci",
    "platform": "Windows-11-10.0.26200-SP0"
  },
  "runs": [
    {
      "task": "01_idempotent_payments",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 1,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_retry",
        "test_hidden::test_missing_key"
      ],
      "must_fail_hit": [],
      "duration_s": 2.594,
      "stderr_tail": "    def test_retry():\n        gateway = FakeGateway()\n        client = TestClient(create_app(os.environ[\"DATABASE_URL\"], gateway))\n        kwargs = dict(headers={\"X-Merchant-Id\": \"merchant_retry\", \"Idempotency-Key\": str(uuid4())},\n                      json={\"amount_minor\": 100, \"currency\": \"CAD\", \"source_token\": \"token_retry\"})\n        first = client.post(\"/v1/payments\", **kwargs)\n        second = client.post(\"/v1/payments\", **kwargs)\n        assert second.status_code == first.status_code == 201\n>       assert second.json() == first.json()\nE       AssertionError: assert {'amount_mino...t_retry', ...} == {'amount_mino...t_retry', ...}\nE         \nE         Omitting 4 identical items, use -vv to show\nE         Differing items:\nE         {'charge_id': 'd15d03d2-5793-48ab-b775-30c7dc75fd60'} != {'charge_id': 'a4053a58-8ff4-4397-844f-66820ff1fec0'}\nE         {'payment_id': 'e4c0decc-d46d-4c6f-9496-22f194756215'} != {'payment_id': '636c5b84-dfc8-45f9-a50f-f08f0bc5296e'}\nE         Use -v to get more diff\n\n..\\grader\\test_hidden.py:24: AssertionError\n______________________________ test_missing_key _______________________________\n\n    def test_missing_key():\n        client = TestClient(create_app(os.environ[\"DATABASE_URL\"], FakeGateway()))\n        response = client.post(\"/v1/payments\", headers={\"X-Merchant-Id\": \"merchant_none\"},\n                               json={\"amount_minor\": 100, \"currency\": \"CAD\", \"source_token\": \"token\"})\n>       assert response.status_code == 400\nE       assert 201 == 400\nE        +  where 201 = <Response [201 Created]>.status_code\n\n..\\grader\\test_hidden.py:32: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_nw1dyle5\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_retry - AssertionError: assert {'amount...\nFAILED ..\\grader\\test_hidden.py::test_missing_key - assert 201 == 400\n2 failed, 1 passed, 1 warning in 0.95s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 17,
        "passed": 2,
        "failed": 15,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_payments::test_sequential_retry",
        "test_hidden_payments::test_concurrent_duplicates_charge_once",
        "test_hidden_payments::test_body_mismatch[change0]",
        "test_hidden_payments::test_body_mismatch[change1]",
        "test_hidden_payments::test_body_mismatch[change2]",
        "test_hidden_payments::test_decline_replayed",
        "test_hidden_payments::test_body_mismatch_while_in_flight",
        "test_hidden_payments::test_replay_survives_app_restart",
        "test_hidden_payments::test_required_key[None]",
        "test_hidden_payments::test_required_key[]",
        "test_hidden_payments::test_required_key[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]",
        "test_hidden_payments::test_valid_key_lengths_and_reordered_body[1]",
        "test_hidden_payments::test_valid_key_lengths_and_reordered_body[100]",
        "test_hidden_payments::test_valid_key_lengths_and_reordered_body[255]",
        "test_hidden_payments::test_concurrent_duplicates_across_app_instances"
      ],
      "must_fail_hit": [],
      "duration_s": 5.191,
      "stderr_tail": "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nfirst = <Response [201 Created]>, second = <Response [201 Created]>\n\n    def same(first, second):\n        assert first.status_code == second.status_code\n>       assert first.json() == second.json()\nE       AssertionError: assert {'amount_mino...t_alpha', ...} == {'amount_mino...t_alpha', ...}\nE         \nE         Omitting 4 identical items, use -vv to show\nE         Differing items:\nE         {'charge_id': 'fd39eeee-362a-4747-b2eb-1af04a1182c4'} != {'charge_id': 'd266ff39-fc9b-4852-b281-be83c4e93e0e'}\nE         {'payment_id': '213ac379-7414-4837-afbb-66a2632bf0b2'} != {'payment_id': '52c0b256-17b2-4fcc-9ab0-b482f0ac9253'}\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_payments.py:35: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_zlv6xmis\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_payments.py::test_sequential_retry - AssertionEr...\nFAILED ..\\grader\\test_hidden_payments.py::test_concurrent_duplicates_charge_once\nFAILED ..\\grader\\test_hidden_payments.py::test_body_mismatch[change0] - asser...\nFAILED ..\\grader\\test_hidden_payments.py::test_body_mismatch[change1] - asser...\nFAILED ..\\grader\\test_hidden_payments.py::test_body_mismatch[change2] - asser...\nFAILED ..\\grader\\test_hidden_payments.py::test_decline_replayed - AssertionEr...\nFAILED ..\\grader\\test_hidden_payments.py::test_body_mismatch_while_in_flight\nFAILED ..\\grader\\test_hidden_payments.py::test_replay_survives_app_restart - ...\nFAILED ..\\grader\\test_hidden_payments.py::test_required_key[None] - assert 20...\nFAILED ..\\grader\\test_hidden_payments.py::test_required_key[] - assert 201 ==...\nFAILED ..\\grader\\test_hidden_payments.py::test_required_key[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]\nFAILED ..\\grader\\test_hidden_payments.py::test_valid_key_lengths_and_reordered_body[1]\nFAILED ..\\grader\\test_hidden_payments.py::test_valid_key_lengths_and_reordered_body[100]\nFAILED ..\\grader\\test_hidden_payments.py::test_valid_key_lengths_and_reordered_body[255]\nFAILED ..\\grader\\test_hidden_payments.py::test_concurrent_duplicates_across_app_instances\n15 failed, 2 passed, 1 warning in 3.97s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.932,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_f77xlw15\\junit.xml -\n3 passed, 1 warning in 0.64s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 17,
        "passed": 17,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 10.685,
      "stderr_tail": ".................                                                        [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_8vn9kc_4\\junit.xml -\n17 passed, 1 warning in 9.29s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.496,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_keypjkng\\junit.xml -\n3 passed, 1 warning in 0.72s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 17,
        "passed": 17,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 9.563,
      "stderr_tail": ".................                                                        [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_vrtv9ow1\\junit.xml -\n17 passed, 1 warning in 7.91s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "wrong_retry_race",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.358,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_pn4q7na8\\junit.xml -\n3 passed, 1 warning in 0.69s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "wrong_retry_race",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 17,
        "passed": 14,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_payments::test_concurrent_duplicates_charge_once",
        "test_hidden_payments::test_body_mismatch_while_in_flight",
        "test_hidden_payments::test_concurrent_duplicates_across_app_instances"
      ],
      "must_fail_hit": [
        "test_concurrent_duplicates_charge_once"
      ],
      "duration_s": 7.187,
      "stderr_tail": "                    barrier = threading.Barrier(8, timeout=15)\n    \n                    def call(index):\n                        barrier.wait()\n                        return client.post([left, right][index % 2] + \"/v1/payments\", **args)\n    \n                    responses = list(pool.map(call, range(8)))\n                    successes = [r for r in responses if r.status_code == 201]\n                    assert successes, [r.status_code for r in responses]\n                    for response in responses:\n                        if response.status_code == 409:\n                            assert response.json()[\"error\"][\"code\"] == \"idempotency_request_in_progress\"\n                        else:\n>                           same(successes[0], response)\n\n..\\grader\\test_hidden_payments.py:227: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nfirst = <Response [201 Created]>\nsecond = <Response [500 Internal Server Error]>\n\n    def same(first, second):\n>       assert first.status_code == second.status_code\nE       assert 201 == 500\nE        +  where 201 = <Response [201 Created]>.status_code\nE        +  and   500 = <Response [500 Internal Server Error]>.status_code\n\n..\\grader\\test_hidden_payments.py:34: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_vx501z65\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_payments.py::test_concurrent_duplicates_charge_once\nFAILED ..\\grader\\test_hidden_payments.py::test_body_mismatch_while_in_flight\nFAILED ..\\grader\\test_hidden_payments.py::test_concurrent_duplicates_across_app_instances\n3 failed, 14 passed, 1 warning in 5.59s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "wrong_uncached_decline",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.432,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_yngzjs1_\\junit.xml -\n3 passed, 1 warning in 0.58s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "wrong_uncached_decline",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 17,
        "passed": 16,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_payments::test_decline_replayed"
      ],
      "must_fail_hit": [
        "test_decline_replayed"
      ],
      "duration_s": 8.994,
      "stderr_tail": "......F..........                                                        [100%]\n================================== FAILURES ===================================\n____________________________ test_decline_replayed ____________________________\n\ndatabase_url = 'user=bcp_01_idempotent_payments__wrong_uncached_dec_654_u dbname=bcp_01_idempotent_payments__wrong_uncached_dec_654310eedde4 host=localhost port=54329 password=NdI7LWLaxkm4iSTWzV3qS0Ds'\n\n    def test_decline_replayed(database_url):\n        gateway = Gateway(declined=True)\n        client = TestClient(create_app(database_url, gateway))\n        args = request()\n        first = client.post(\"/v1/payments\", **args)\n        assert first.status_code == 402\n        assert first.json()[\"error\"][\"code\"] == \"card_declined\"\n        same(first, client.post(\"/v1/payments\", **args))\n>       assert len(gateway.calls) == 1\nE       AssertionError: assert 2 == 1\nE        +  where 2 = len([('merchant_alpha', 1250, 'CAD', 'token_synthetic'), ('merchant_alpha', 1250, 'CAD', 'token_synthetic')])\nE        +    where [('merchant_alpha', 1250, 'CAD', 'token_synthetic'), ('merchant_alpha', 1250, 'CAD', 'token_synthetic')] = <test_hidden_payments.Gateway object at 0x000001BFBB743790>.calls\n\n..\\grader\\test_hidden_payments.py:113: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_f59hd8u2\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_payments.py::test_decline_replayed - AssertionEr...\n1 failed, 16 passed, 1 warning in 8.33s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "wrong_inmemory_cache",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.787,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_vgk1gtxd\\junit.xml -\n3 passed, 1 warning in 0.71s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "01_idempotent_payments",
      "variant": "wrong_inmemory_cache",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 17,
        "passed": 15,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_payments::test_replay_survives_app_restart",
        "test_hidden_payments::test_concurrent_duplicates_across_app_instances"
      ],
      "must_fail_hit": [
        "test_replay_survives_app_restart"
      ],
      "duration_s": 6.121,
      "stderr_tail": "                        barrier.wait()\n                        return client.post([left, right][index % 2] + \"/v1/payments\", **args)\n    \n                    responses = list(pool.map(call, range(8)))\n                    successes = [r for r in responses if r.status_code == 201]\n                    assert successes, [r.status_code for r in responses]\n                    for response in responses:\n                        if response.status_code == 409:\n                            assert response.json()[\"error\"][\"code\"] == \"idempotency_request_in_progress\"\n                        else:\n>                           same(successes[0], response)\n\n..\\grader\\test_hidden_payments.py:227: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nfirst = <Response [201 Created]>, second = <Response [201 Created]>\n\n    def same(first, second):\n        assert first.status_code == second.status_code\n>       assert first.json() == second.json()\nE       AssertionError: assert {'amount_mino...t_alpha', ...} == {'amount_mino...t_alpha', ...}\nE         \nE         Omitting 4 identical items, use -vv to show\nE         Differing items:\nE         {'charge_id': '1773f353-f4a5-473a-ac31-f40452de564a'} != {'charge_id': '65240c24-3115-4ca3-9996-5ee9c43c459e'}\nE         {'payment_id': 'a5a8de47-5586-4d10-b85f-820ad75ad37b'} != {'payment_id': 'e2fe76b5-469e-41b7-a66c-0279e393216f'}\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_payments.py:35: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_f5aei643\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_payments.py::test_replay_survives_app_restart - ...\nFAILED ..\\grader\\test_hidden_payments.py::test_concurrent_duplicates_across_app_instances\n2 failed, 15 passed, 1 warning in 5.35s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.75,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_5i6d48ew\\junit.xml -\n4 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 33,
        "passed": 24,
        "failed": 9,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_interest::test_half_cent_ties_bankers[50-0.0365-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[73-0.025-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[25-0.0365-2]",
        "test_hidden_interest::test_half_cent_ties_bankers[237250.00-0.0001-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[237250.00-0.0001-29]",
        "test_hidden_interest::test_large_principal_exact[simple_monthly]",
        "test_hidden_interest::test_large_principal_exact[daily_compound]",
        "test_hidden_interest::test_leap_and_partial",
        "test_hidden_interest::test_accrual_properties"
      ],
      "must_fail_hit": [],
      "duration_s": 1.002,
      "stderr_tail": "..\\grader\\test_hidden_interest.py:95: in test_accrual_properties\n    rows = check(principal, annual_rate, start, end, method)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nprincipal = Decimal('5573.85'), rate = Decimal('0.1500')\nstart = datetime.date(2024, 1, 13), end = datetime.date(2024, 2, 17)\nmethod = 'simple_monthly'\n\n    def check(principal, rate, start, end, method):\n        rows = accrue(principal, rate, start, end, method)\n        for row in rows:\n            assert_money(row.interest)\n            assert_money(row.balance)\n>       assert [(r.posting_date, r.interest, r.balance) for r in rows] == oracle(principal, rate, start, end, method)\nE       AssertionError: assert [(datetime.da...l('5617.37'))] == [(datetime.da...l('5654.31'))]\nE         \nE         Right contains one more item: (datetime.date(2024, 2, 16), Decimal('36.94'), Decimal('5654.31'))\nE         Use -v to get more diff\nE       Failing test case: test_accrual_properties(\nE           cents=557385,\nE           rate=1500,\nE           offset=12,\nE           days=35,\nE           method='simple_monthly',\nE       )\n\n..\\grader\\test_hidden_interest.py:34: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run__fa9icp6\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[50-0.0365-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[73-0.025-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[25-0.0365-2]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[237250.00-0.0001-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[237250.00-0.0001-29]\nFAILED ..\\grader\\test_hidden_interest.py::test_large_principal_exact[simple_monthly]\nFAILED ..\\grader\\test_hidden_interest.py::test_large_principal_exact[daily_compound]\nFAILED ..\\grader\\test_hidden_interest.py::test_leap_and_partial - AssertionEr...\nFAILED ..\\grader\\test_hidden_interest.py::test_accrual_properties - Assertion...\n9 failed, 24 passed in 0.23s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.798,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_0d3lpkcz\\junit.xml -\n4 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 33,
        "passed": 33,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.203,
      "stderr_tail": ".................................                                        [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_gngprbsr\\junit.xml -\n33 passed in 0.48s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.711,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_9vpw220q\\junit.xml -\n4 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 33,
        "passed": 33,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.905,
      "stderr_tail": ".................................                                        [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_r8vq9kl9\\junit.xml -\n33 passed in 0.31s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "wrong_float",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.489,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_g_krp4wo\\junit.xml -\n4 passed in 0.02s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "wrong_float",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 33,
        "passed": 28,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_interest::test_half_cent_ties_bankers[50-0.0365-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[73-0.025-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[25-0.0365-2]",
        "test_hidden_interest::test_half_cent_ties_bankers[237250.00-0.0001-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[237250.00-0.0001-29]"
      ],
      "must_fail_hit": [
        "test_half_cent_ties_bankers"
      ],
      "duration_s": 0.78,
      "stderr_tail": "______________ test_half_cent_ties_bankers[237250.00-0.0001-29] _______________\n\nprincipal = '237250.00', rate = '0.0001', days = 29\n\n    @pytest.mark.parametrize(\"principal,rate,days\", [\n        (\"50\", \"0.0365\", 1), (\"73\", \"0.025\", 1), (\"25\", \"0.0365\", 2),\n        (\"237250.00\", \"0.0001\", 1), (\"237250.00\", \"0.0001\", 29),\n        (\"237250.00\", \"0.0001\", 31),\n    ])\n    def test_half_cent_ties_bankers(principal, rate, days):\n        # Search output from tools/find_ties.py, independently cross-checked with Fraction.\n>       check(D(principal), D(rate), date(2026, 1, 1), date(2026, 1, 1) + timedelta(days=days), \"simple_monthly\")\n\n..\\grader\\test_hidden_interest.py:46: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nprincipal = Decimal('237250.00'), rate = Decimal('0.0001')\nstart = datetime.date(2026, 1, 1), end = datetime.date(2026, 1, 30)\nmethod = 'simple_monthly'\n\n    def check(principal, rate, start, end, method):\n        rows = accrue(principal, rate, start, end, method)\n        for row in rows:\n            assert_money(row.interest)\n            assert_money(row.balance)\n>       assert [(r.posting_date, r.interest, r.balance) for r in rows] == oracle(principal, rate, start, end, method)\nE       AssertionError: assert [(datetime.da...'237251.89'))] == [(datetime.da...'237251.88'))]\nE         \nE         At index 0 diff: (datetime.date(2026, 1, 29), Decimal('1.89'), Decimal('237251.89')) != (datetime.date(2026, 1, 29), Decimal('1.88'), Decimal('237251.88'))\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_interest.py:34: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_r810n6ex\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[50-0.0365-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[73-0.025-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[25-0.0365-2]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[237250.00-0.0001-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[237250.00-0.0001-29]\n5 failed, 28 passed in 0.31s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "wrong_half_up",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.455,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_kg9x67z1\\junit.xml -\n4 passed in 0.02s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "wrong_half_up",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 33,
        "passed": 28,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_interest::test_half_cent_ties_bankers[50-0.0365-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[73-0.025-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[25-0.0365-2]",
        "test_hidden_interest::test_half_cent_ties_bankers[237250.00-0.0001-1]",
        "test_hidden_interest::test_half_cent_ties_bankers[237250.00-0.0001-29]"
      ],
      "must_fail_hit": [
        "test_half_cent_ties_bankers"
      ],
      "duration_s": 0.813,
      "stderr_tail": "______________ test_half_cent_ties_bankers[237250.00-0.0001-29] _______________\n\nprincipal = '237250.00', rate = '0.0001', days = 29\n\n    @pytest.mark.parametrize(\"principal,rate,days\", [\n        (\"50\", \"0.0365\", 1), (\"73\", \"0.025\", 1), (\"25\", \"0.0365\", 2),\n        (\"237250.00\", \"0.0001\", 1), (\"237250.00\", \"0.0001\", 29),\n        (\"237250.00\", \"0.0001\", 31),\n    ])\n    def test_half_cent_ties_bankers(principal, rate, days):\n        # Search output from tools/find_ties.py, independently cross-checked with Fraction.\n>       check(D(principal), D(rate), date(2026, 1, 1), date(2026, 1, 1) + timedelta(days=days), \"simple_monthly\")\n\n..\\grader\\test_hidden_interest.py:46: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nprincipal = Decimal('237250.00'), rate = Decimal('0.0001')\nstart = datetime.date(2026, 1, 1), end = datetime.date(2026, 1, 30)\nmethod = 'simple_monthly'\n\n    def check(principal, rate, start, end, method):\n        rows = accrue(principal, rate, start, end, method)\n        for row in rows:\n            assert_money(row.interest)\n            assert_money(row.balance)\n>       assert [(r.posting_date, r.interest, r.balance) for r in rows] == oracle(principal, rate, start, end, method)\nE       AssertionError: assert [(datetime.da...'237251.89'))] == [(datetime.da...'237251.88'))]\nE         \nE         At index 0 diff: (datetime.date(2026, 1, 29), Decimal('1.89'), Decimal('237251.89')) != (datetime.date(2026, 1, 29), Decimal('1.88'), Decimal('237251.88'))\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_interest.py:34: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_3fbiawui\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[50-0.0365-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[73-0.025-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[25-0.0365-2]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[237250.00-0.0001-1]\nFAILED ..\\grader\\test_hidden_interest.py::test_half_cent_ties_bankers[237250.00-0.0001-29]\n5 failed, 28 passed in 0.33s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "wrong_actual_actual",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.471,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_315f0338\\junit.xml -\n4 passed in 0.02s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "02_interest_accrual",
      "variant": "wrong_actual_actual",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 33,
        "passed": 29,
        "failed": 4,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_interest::test_large_principal_exact[simple_monthly]",
        "test_hidden_interest::test_large_principal_exact[daily_compound]",
        "test_hidden_interest::test_leap_and_partial",
        "test_hidden_interest::test_accrual_properties"
      ],
      "must_fail_hit": [
        "test_leap_and_partial",
        "test_large_principal_exact",
        "test_accrual_properties"
      ],
      "duration_s": 0.536,
      "stderr_tail": "                   ^^^\n           method=st.sampled_from([\"simple_monthly\", \"daily_compound\"]))\n\n..\\grader\\test_hidden_interest.py:89: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\grader\\test_hidden_interest.py:95: in test_accrual_properties\n    rows = check(principal, annual_rate, start, end, method)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nprincipal = Decimal('5573.85'), rate = Decimal('0.1500')\nstart = datetime.date(2024, 1, 13), end = datetime.date(2024, 2, 17)\nmethod = 'simple_monthly'\n\n    def check(principal, rate, start, end, method):\n        rows = accrue(principal, rate, start, end, method)\n        for row in rows:\n            assert_money(row.interest)\n            assert_money(row.balance)\n>       assert [(r.posting_date, r.interest, r.balance) for r in rows] == oracle(principal, rate, start, end, method)\nE       AssertionError: assert [(datetime.da...l('5654.08'))] == [(datetime.da...l('5654.31'))]\nE         \nE         At index 0 diff: (datetime.date(2024, 1, 31), Decimal('43.40'), Decimal('5617.25')) != (datetime.date(2024, 1, 31), Decimal('43.52'), Decimal('5617.37'))\nE         Use -v to get more diff\nE       Failing test case: test_accrual_properties(\nE           cents=557385,\nE           rate=1500,\nE           offset=12,\nE           days=35,\nE           method='simple_monthly',\nE       )\n\n..\\grader\\test_hidden_interest.py:34: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_a95hbscd\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_interest.py::test_large_principal_exact[simple_monthly]\nFAILED ..\\grader\\test_hidden_interest.py::test_large_principal_exact[daily_compound]\nFAILED ..\\grader\\test_hidden_interest.py::test_leap_and_partial - AssertionEr...\nFAILED ..\\grader\\test_hidden_interest.py::test_accrual_properties - Assertion...\n4 failed, 29 passed in 0.10s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 1,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_direct_cad_usd",
        "test_hidden::test_ticket_example_cross_quote",
        "test_hidden::test_ticket_example_zero_decimal_currency"
      ],
      "must_fail_hit": [],
      "duration_s": 0.499,
      "stderr_tail": "The above exception was the direct cause of the following exception:\n\n    def test_ticket_example_cross_quote():\n        rates = {(\"GBP\", \"USD\"): D(\"1.25\"), (\"USD\", \"CAD\"): D(\"1.40\")}\n>       result = quote_transfer(20000, \"GBP\", \"CAD\", rates, 50)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n..\\grader\\test_hidden.py:14: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\namount_minor = 20000, src = 'GBP', dst = 'CAD'\nrates = {('GBP', 'USD'): Decimal('1.25'), ('USD', 'CAD'): Decimal('1.40')}\nfee_bps = 50\n\n    def quote_transfer(amount_minor, src, dst, rates, fee_bps):\n        validate(amount_minor, src, dst, fee_bps)\n        try:\n            rate = rates[src, dst]\n        except KeyError as exc:\n>           raise RateUnavailable((src, dst)) from exc\nE           fx.models.RateUnavailable: ('GBP', 'CAD')\n\nfx\\quote.py:12: RateUnavailable\n__________________ test_ticket_example_zero_decimal_currency __________________\n\n    def test_ticket_example_zero_decimal_currency():\n        result = quote_transfer(5000, \"CAD\", \"JPY\", {(\"CAD\", \"JPY\"): D(\"110\")}, 0)\n>       assert (result.fee_minor, result.converted_minor) == (0, 5500)\nE       assert (0, 550000) == (0, 5500)\nE         \nE         At index 1 diff: 550000 != 5500\nE         Use -v to get more diff\n\n..\\grader\\test_hidden.py:22: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_vd2dl9ix\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_direct_cad_usd - AssertionError: assert...\nFAILED ..\\grader\\test_hidden.py::test_ticket_example_cross_quote - fx.models....\nFAILED ..\\grader\\test_hidden.py::test_ticket_example_zero_decimal_currency - ...\n3 failed, 1 passed in 0.05s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 22,
        "passed": 16,
        "failed": 6,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fx::test_jpy_and_kwd_units",
        "test_hidden_fx::test_cross_has_no_intermediate_rounding",
        "test_hidden_fx::test_source_fee_before_conversion",
        "test_hidden_fx::test_full_precision_cross_rate[1.23456789-1.34567891]",
        "test_hidden_fx::test_full_precision_cross_rate[1.12345678901234567890123456789-1.98765432109876543210987654321]",
        "test_hidden_fx::test_exact_scaling_and_monotonicity"
      ],
      "must_fail_hit": [],
      "duration_s": 0.687,
      "stderr_tail": "..\\grader\\test_hidden_fx.py:94: in test_exact_scaling_and_monotonicity\n    first = check(amount, src, dst, rates, bps)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\namount = 533000, src = 'JPY', dst = 'KWD'\nrates = {('JPY', 'KWD'): Decimal('0.0389')}, bps = 161\n\n    def check(amount, src, dst, rates, bps):\n        before = dict(rates)\n        result = quote_transfer(amount, src, dst, rates, bps)\n        path = (src, dst) if (src, dst) in rates else (src, \"USD\", dst)\n        rate = Fraction(1)\n        for pair in zip(path, path[1:]):\n            rate *= Fraction(rates[pair])\n        fee = nearest(Fraction(amount * bps, 10000))\n        converted = nearest(Fraction(amount - fee, 10**UNITS[src]) * rate * 10**UNITS[dst])\n        assert type(result.fee_minor) is type(result.converted_minor) is int\n        assert result.fee_minor == fee\n>       assert result.converted_minor == converted\nE       AssertionError: assert 20734 == 20399899\nE        +  where 20734 = Quote(fee_minor=8581, converted_minor=20734, rate_used=Decimal('0.0389'), path=('JPY', 'KWD')).converted_minor\nE       Failing test case: test_exact_scaling_and_monotonicity(\nE           amount=533000,\nE           extra=712,\nE           units=389,\nE           bps=161,\nE           pair=('JPY', 'KWD'),\nE       )\n\n..\\grader\\test_hidden_fx.py:26: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_w_t94yoy\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fx.py::test_jpy_and_kwd_units - AssertionError: ...\nFAILED ..\\grader\\test_hidden_fx.py::test_cross_has_no_intermediate_rounding\nFAILED ..\\grader\\test_hidden_fx.py::test_source_fee_before_conversion - Asser...\nFAILED ..\\grader\\test_hidden_fx.py::test_full_precision_cross_rate[1.23456789-1.34567891]\nFAILED ..\\grader\\test_hidden_fx.py::test_full_precision_cross_rate[1.12345678901234567890123456789-1.98765432109876543210987654321]\nFAILED ..\\grader\\test_hidden_fx.py::test_exact_scaling_and_monotonicity - Ass...\n6 failed, 16 passed in 0.25s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.448,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_xesc96rd\\junit.xml -\n4 passed in 0.01s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 22,
        "passed": 22,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.759,
      "stderr_tail": "......................                                                   [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run__63alop2\\junit.xml -\n22 passed in 0.29s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.449,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_1r15mjgr\\junit.xml -\n4 passed in 0.01s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 22,
        "passed": 22,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.754,
      "stderr_tail": "......................                                                   [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_dlunvl9e\\junit.xml -\n22 passed in 0.31s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "wrong_two_decimals",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 4,
        "passed": 3,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_example_zero_decimal_currency"
      ],
      "must_fail_hit": [],
      "duration_s": 0.488,
      "stderr_tail": "..F.                                                                     [100%]\n================================== FAILURES ===================================\n__________________ test_ticket_example_zero_decimal_currency __________________\n\n    def test_ticket_example_zero_decimal_currency():\n        result = quote_transfer(5000, \"CAD\", \"JPY\", {(\"CAD\", \"JPY\"): D(\"110\")}, 0)\n>       assert (result.fee_minor, result.converted_minor) == (0, 5500)\nE       assert (0, 550000) == (0, 5500)\nE         \nE         At index 1 diff: 550000 != 5500\nE         Use -v to get more diff\n\n..\\grader\\test_hidden.py:22: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_crk3_cwz\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_example_zero_decimal_currency - ...\n1 failed, 3 passed in 0.05s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "wrong_two_decimals",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 22,
        "passed": 20,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fx::test_jpy_and_kwd_units",
        "test_hidden_fx::test_exact_scaling_and_monotonicity"
      ],
      "must_fail_hit": [
        "test_jpy_and_kwd_units"
      ],
      "duration_s": 0.686,
      "stderr_tail": "                   ^^^\n\n..\\grader\\test_hidden_fx.py:90: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\grader\\test_hidden_fx.py:94: in test_exact_scaling_and_monotonicity\n    first = check(amount, src, dst, rates, bps)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\namount = 533000, src = 'JPY', dst = 'KWD'\nrates = {('JPY', 'KWD'): Decimal('0.0389')}, bps = 161\n\n    def check(amount, src, dst, rates, bps):\n        before = dict(rates)\n        result = quote_transfer(amount, src, dst, rates, bps)\n        path = (src, dst) if (src, dst) in rates else (src, \"USD\", dst)\n        rate = Fraction(1)\n        for pair in zip(path, path[1:]):\n            rate *= Fraction(rates[pair])\n        fee = nearest(Fraction(amount * bps, 10000))\n        converted = nearest(Fraction(amount - fee, 10**UNITS[src]) * rate * 10**UNITS[dst])\n        assert type(result.fee_minor) is type(result.converted_minor) is int\n        assert result.fee_minor == fee\n>       assert result.converted_minor == converted\nE       AssertionError: assert 20400 == 20399899\nE        +  where 20400 = Quote(fee_minor=8581, converted_minor=20400, rate_used=Decimal('0.0389'), path=('JPY', 'KWD')).converted_minor\nE       Failing test case: test_exact_scaling_and_monotonicity(\nE           amount=533000,\nE           extra=712,\nE           units=389,\nE           bps=161,\nE           pair=('JPY', 'KWD'),\nE       )\n\n..\\grader\\test_hidden_fx.py:26: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_m_xfckpl\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fx.py::test_jpy_and_kwd_units - AssertionError: ...\nFAILED ..\\grader\\test_hidden_fx.py::test_exact_scaling_and_monotonicity - Ass...\n2 failed, 20 passed in 0.23s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "wrong_round_cross_leg",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.45,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_sij0vysq\\junit.xml -\n4 passed in 0.01s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "wrong_round_cross_leg",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 22,
        "passed": 19,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fx::test_cross_has_no_intermediate_rounding",
        "test_hidden_fx::test_full_precision_cross_rate[1.23456789-1.34567891]",
        "test_hidden_fx::test_full_precision_cross_rate[1.12345678901234567890123456789-1.98765432109876543210987654321]"
      ],
      "must_fail_hit": [
        "test_cross_has_no_intermediate_rounding"
      ],
      "duration_s": 0.799,
      "stderr_tail": "\nleft = '1.12345678901234567890123456789'\nright = '1.98765432109876543210987654321'\n\n    @pytest.mark.parametrize(\"left,right\", [\n        (\"1.23456789\", \"1.34567891\"),\n        (\"1.12345678901234567890123456789\", \"1.98765432109876543210987654321\"),\n    ])\n    def test_full_precision_cross_rate(left, right):\n>       check(10**9, \"GBP\", \"CAD\", {(\"GBP\", \"USD\"): D(left), (\"USD\", \"CAD\"): D(right)}, 17)\n\n..\\grader\\test_hidden_fx.py:77: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\namount = 1000000000, src = 'GBP', dst = 'CAD'\nrates = {('GBP', 'USD'): Decimal('1.12345678901234567890123456789'), ('USD', 'CAD'): Decimal('1.98765432109876543210987654321')}\nbps = 17\n\n    def check(amount, src, dst, rates, bps):\n        before = dict(rates)\n        result = quote_transfer(amount, src, dst, rates, bps)\n        path = (src, dst) if (src, dst) in rates else (src, \"USD\", dst)\n        rate = Fraction(1)\n        for pair in zip(path, path[1:]):\n            rate *= Fraction(rates[pair])\n        fee = nearest(Fraction(amount * bps, 10000))\n        converted = nearest(Fraction(amount - fee, 10**UNITS[src]) * rate * 10**UNITS[dst])\n        assert type(result.fee_minor) is type(result.converted_minor) is int\n        assert result.fee_minor == fee\n>       assert result.converted_minor == converted\nE       AssertionError: assert 2229247566 == 2229247567\nE        +  where 2229247566 = Quote(fee_minor=1700000, converted_minor=2229247566, rate_used=Decimal('2.2330437412481329062372961438336229233322374638011112635269'), path=('GBP', 'USD', 'CAD')).converted_minor\n\n..\\grader\\test_hidden_fx.py:26: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_edagtfro\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fx.py::test_cross_has_no_intermediate_rounding\nFAILED ..\\grader\\test_hidden_fx.py::test_full_precision_cross_rate[1.23456789-1.34567891]\nFAILED ..\\grader\\test_hidden_fx.py::test_full_precision_cross_rate[1.12345678901234567890123456789-1.98765432109876543210987654321]\n3 failed, 19 passed in 0.35s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "wrong_fee_after_conversion",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.458,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_nxd5tgg6\\junit.xml -\n4 passed in 0.01s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "03_fx_quotes",
      "variant": "wrong_fee_after_conversion",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 22,
        "passed": 18,
        "failed": 4,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fx::test_jpy_and_kwd_units",
        "test_hidden_fx::test_source_fee_before_conversion",
        "test_hidden_fx::test_full_precision_cross_rate[1.23456789-1.34567891]",
        "test_hidden_fx::test_exact_scaling_and_monotonicity"
      ],
      "must_fail_hit": [
        "test_source_fee_before_conversion"
      ],
      "duration_s": 0.685,
      "stderr_tail": "..\\grader\\test_hidden_fx.py:90: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\grader\\test_hidden_fx.py:94: in test_exact_scaling_and_monotonicity\n    first = check(amount, src, dst, rates, bps)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\namount = 533000, src = 'JPY', dst = 'KWD'\nrates = {('JPY', 'KWD'): Decimal('0.0389')}, bps = 161\n\n    def check(amount, src, dst, rates, bps):\n        before = dict(rates)\n        result = quote_transfer(amount, src, dst, rates, bps)\n        path = (src, dst) if (src, dst) in rates else (src, \"USD\", dst)\n        rate = Fraction(1)\n        for pair in zip(path, path[1:]):\n            rate *= Fraction(rates[pair])\n        fee = nearest(Fraction(amount * bps, 10000))\n        converted = nearest(Fraction(amount - fee, 10**UNITS[src]) * rate * 10**UNITS[dst])\n        assert type(result.fee_minor) is type(result.converted_minor) is int\n        assert result.fee_minor == fee\n>       assert result.converted_minor == converted\nE       AssertionError: assert 20399887 == 20399899\nE        +  where 20399887 = Quote(fee_minor=8581, converted_minor=20399887, rate_used=Decimal('0.0389'), path=('JPY', 'KWD')).converted_minor\nE       Failing test case: test_exact_scaling_and_monotonicity(\nE           amount=533000,\nE           extra=712,\nE           units=389,\nE           bps=161,\nE           pair=('JPY', 'KWD'),\nE       )\n\n..\\grader\\test_hidden_fx.py:26: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_65odwuby\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fx.py::test_jpy_and_kwd_units - AssertionError: ...\nFAILED ..\\grader\\test_hidden_fx.py::test_source_fee_before_conversion - Asser...\nFAILED ..\\grader\\test_hidden_fx.py::test_full_precision_cross_rate[1.23456789-1.34567891]\nFAILED ..\\grader\\test_hidden_fx.py::test_exact_scaling_and_monotonicity - Ass...\n4 failed, 18 passed in 0.24s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 0.493,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\n    def test_ticket_worked_example():\n        statement = [StatementLine(\"s1\", date(2026, 1, 5), 10000, \"INV-1\"),\n                     StatementLine(\"s2\", date(2026, 1, 6), 4000, \"INV-2\"),\n                     StatementLine(\"s3\", date(2026, 1, 7), 6000, \"INV-2\")]\n        ledger = [LedgerEntry(\"l1\", date(2026, 1, 3), 10000, \"INV-1\"),\n                  LedgerEntry(\"l2\", date(2026, 1, 6), 10000, \"INV-2\")]\n        result = reconcile(statement, ledger)\n>       assert len(result.matches) == 2\nE       AssertionError: assert 0 == 2\nE        +  where 0 = len([])\nE        +    where [] = ReconResult(matches=[], unmatched_statement={'s1': 'no_match', 's2': 'no_match', 's3': 'no_match'}, unmatched_ledger={'l1', 'l2'}).matches\n\n..\\grader\\test_hidden.py:19: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_8jfutfre\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - AssertionError:...\n1 failed, 2 passed in 0.05s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 18,
        "passed": 5,
        "failed": 13,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_recon::test_duplicate_statement_line_left_unmatched",
        "test_hidden_recon::test_split_all_lines",
        "test_hidden_recon::test_refund_kind_and_original_reference",
        "test_hidden_recon::test_tie_breaks_and_window",
        "test_hidden_recon::test_ordering_and_candidate_rules[r1-booking-date]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r1-payments-only]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r2-booking-date]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r2-id]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r2-signed-lines]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r3-booking-date]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r3-id]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r3-statement-order]",
        "test_hidden_recon::test_ground_truth_transforms"
      ],
      "must_fail_hit": [],
      "duration_s": 0.584,
      "stderr_tail": "                statement.append(S(sid, DAY, amount, reference))\n                ledger.append(L(lid, DAY, amount + 1, reference))\n                reasons[sid] = \"no_match\"\n                unmatched.add(lid)\n            else:\n                statement.append(S(sid, DAY, amount, reference))\n                ledger.append(L(lid, DAY, amount, reference))\n                truth.add(match([sid], [lid], \"R1\"))\n                if mode == \"duplicate\":\n                    statement.append(S(sid + \"z\", DAY, amount, reference))\n                    reasons[sid + \"z\"] = \"duplicate\"\n        before = (list(statement), list(ledger))\n        result = reconcile(list(reversed(statement)), list(reversed(ledger)))\n>       assert pairs(result) == truth\nE       AssertionError: assert {(frozenset({...'l0'}), 'R1')} == {(frozenset({...'l0'}), 'R1')}\nE         \nE         Extra items in the left set:\nE         (frozenset({'s0z'}), frozenset({'l0'}), 'R1')\nE         Use -v to get more diff\nE       Failing test case: test_ground_truth_transforms(\nE           cases=[('duplicate', 10, 2)],\nE       )\n\n..\\grader\\test_hidden_recon.py:162: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_wzoi3k0n\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_recon.py::test_duplicate_statement_line_left_unmatched\nFAILED ..\\grader\\test_hidden_recon.py::test_split_all_lines - AssertionError:...\nFAILED ..\\grader\\test_hidden_recon.py::test_refund_kind_and_original_reference\nFAILED ..\\grader\\test_hidden_recon.py::test_tie_breaks_and_window - Assertion...\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r1-booking-date]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r1-payments-only]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r2-booking-date]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r2-id]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r2-signed-lines]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r3-booking-date]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r3-id]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r3-statement-order]\nFAILED ..\\grader\\test_hidden_recon.py::test_ground_truth_transforms - Asserti...\n13 failed, 5 passed in 0.14s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.455,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_8a7fr7f9\\junit.xml -\n3 passed in 0.01s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 18,
        "passed": 18,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.767,
      "stderr_tail": "..................                                                       [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_0zyy55dh\\junit.xml -\n18 passed in 0.30s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.441,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_vvl4as1w\\junit.xml -\n3 passed in 0.01s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 18,
        "passed": 18,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.754,
      "stderr_tail": "..................                                                       [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_j4o4d9ff\\junit.xml -\n18 passed in 0.29s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "wrong_no_consumption",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.463,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_z2n_yp7t\\junit.xml -\n3 passed in 0.01s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "wrong_no_consumption",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 18,
        "passed": 14,
        "failed": 4,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_recon::test_duplicate_statement_line_left_unmatched",
        "test_hidden_recon::test_ordering_and_candidate_rules[r1-statement-order]",
        "test_hidden_recon::test_duplicate_signature_includes_date",
        "test_hidden_recon::test_ground_truth_transforms"
      ],
      "must_fail_hit": [
        "test_duplicate_statement_line_left_unmatched"
      ],
      "duration_s": 0.58,
      "stderr_tail": "                ledger.append(L(lid, DAY, amount, reference))\n                ids = []\n                for j in range(parts):\n                    identifier = f\"{sid}_{j}\"\n                    value = amount // parts if j < parts - 1 else amount - (amount // parts) * (parts - 1)\n                    statement.append(S(identifier, DAY, value, reference))\n                    ids.append(identifier)\n                truth.add(match(ids, [lid], \"R2\"))\n            elif mode == \"noise\":\n                statement.append(S(sid, DAY, amount, reference))\n                ledger.append(L(lid, DAY, amount + 1, reference))\n                reasons[sid] = \"no_match\"\n                unmatched.add(lid)\n            else:\n                statement.append(S(sid, DAY, amount, reference))\n                ledger.append(L(lid, DAY, amount, reference))\n                truth.add(match([sid], [lid], \"R1\"))\n                if mode == \"duplicate\":\n                    statement.append(S(sid + \"z\", DAY, amount, reference))\n                    reasons[sid + \"z\"] = \"duplicate\"\n        before = (list(statement), list(ledger))\n        result = reconcile(list(reversed(statement)), list(reversed(ledger)))\n>       assert pairs(result) == truth\nE       AssertionError: assert {(frozenset({...'l0'}), 'R1')} == {(frozenset({...'l0'}), 'R1')}\nE         \nE         Extra items in the left set:\nE         (frozenset({'s0z'}), frozenset({'l0'}), 'R1')\nE         Use -v to get more diff\nE       Failing test case: test_ground_truth_transforms(\nE           cases=[('duplicate', 10, 2)],\nE       )\n\n..\\grader\\test_hidden_recon.py:162: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_h8jt4fu1\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_recon.py::test_duplicate_statement_line_left_unmatched\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r1-statement-order]\nFAILED ..\\grader\\test_hidden_recon.py::test_duplicate_signature_includes_date\nFAILED ..\\grader\\test_hidden_recon.py::test_ground_truth_transforms - Asserti...\n4 failed, 14 passed in 0.10s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "wrong_split_ignored",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 0.482,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\n    def test_ticket_worked_example():\n        statement = [StatementLine(\"s1\", date(2026, 1, 5), 10000, \"INV-1\"),\n                     StatementLine(\"s2\", date(2026, 1, 6), 4000, \"INV-2\"),\n                     StatementLine(\"s3\", date(2026, 1, 7), 6000, \"INV-2\")]\n        ledger = [LedgerEntry(\"l1\", date(2026, 1, 3), 10000, \"INV-1\"),\n                  LedgerEntry(\"l2\", date(2026, 1, 6), 10000, \"INV-2\")]\n        result = reconcile(statement, ledger)\n>       assert len(result.matches) == 2\nE       AssertionError: assert 1 == 2\nE        +  where 1 = len([Match(statement_ids=frozenset({'s1'}), ledger_ids=frozenset({'l1'}), rule='R1')])\nE        +    where [Match(statement_ids=frozenset({'s1'}), ledger_ids=frozenset({'l1'}), rule='R1')] = ReconResult(matches=[Match(statement_ids=frozenset({'s1'}), ledger_ids=frozenset({'l1'}), rule='R1')], unmatched_statement={'s2': 'no_match', 's3': 'no_match'}, unmatched_ledger={'l2'}).matches\n\n..\\grader\\test_hidden.py:19: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_4spdb36l\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - AssertionError:...\n1 failed, 2 passed in 0.05s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "wrong_split_ignored",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 18,
        "passed": 13,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_recon::test_split_all_lines",
        "test_hidden_recon::test_ordering_and_candidate_rules[r2-booking-date]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r2-id]",
        "test_hidden_recon::test_ordering_and_candidate_rules[r2-signed-lines]",
        "test_hidden_recon::test_ground_truth_transforms"
      ],
      "must_fail_hit": [
        "test_split_all_lines"
      ],
      "duration_s": 0.626,
      "stderr_tail": "                ids = []\n                for j in range(parts):\n                    identifier = f\"{sid}_{j}\"\n                    value = amount // parts if j < parts - 1 else amount - (amount // parts) * (parts - 1)\n                    statement.append(S(identifier, DAY, value, reference))\n                    ids.append(identifier)\n                truth.add(match(ids, [lid], \"R2\"))\n            elif mode == \"noise\":\n                statement.append(S(sid, DAY, amount, reference))\n                ledger.append(L(lid, DAY, amount + 1, reference))\n                reasons[sid] = \"no_match\"\n                unmatched.add(lid)\n            else:\n                statement.append(S(sid, DAY, amount, reference))\n                ledger.append(L(lid, DAY, amount, reference))\n                truth.add(match([sid], [lid], \"R1\"))\n                if mode == \"duplicate\":\n                    statement.append(S(sid + \"z\", DAY, amount, reference))\n                    reasons[sid + \"z\"] = \"duplicate\"\n        before = (list(statement), list(ledger))\n        result = reconcile(list(reversed(statement)), list(reversed(ledger)))\n>       assert pairs(result) == truth\nE       AssertionError: assert set() == {(frozenset({...'l0'}), 'R2')}\nE         \nE         Extra items in the right set:\nE         (frozenset({'s0_0', 's0_1'}), frozenset({'l0'}), 'R2')\nE         Use -v to get more diff\nE       Failing test case: test_ground_truth_transforms(\nE           cases=[('split', 10, 2)],\nE       )\n\n..\\grader\\test_hidden_recon.py:162: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_pw_6kdtc\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_recon.py::test_split_all_lines - AssertionError:...\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r2-booking-date]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r2-id]\nFAILED ..\\grader\\test_hidden_recon.py::test_ordering_and_candidate_rules[r2-signed-lines]\nFAILED ..\\grader\\test_hidden_recon.py::test_ground_truth_transforms - Asserti...\n5 failed, 13 passed in 0.17s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "wrong_refund_abs",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.451,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_h3_l9uod\\junit.xml -\n3 passed in 0.01s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "04_ledger_reconciliation",
      "variant": "wrong_refund_abs",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 18,
        "passed": 17,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_recon::test_refund_kind_and_original_reference"
      ],
      "must_fail_hit": [
        "test_refund_kind_and_original_reference"
      ],
      "duration_s": 0.795,
      "stderr_tail": "...F..............                                                       [100%]\n================================== FAILURES ===================================\n___________________ test_refund_kind_and_original_reference ___________________\n\n    def test_refund_kind_and_original_reference():\n        statement = [S(\"s\", DAY, -100, \"original\")]\n        ledger = [L(\"payment\", DAY, 100, \"original\"),\n                  L(\"refund\", DAY + timedelta(days=30), 100, \"other\", \"refund\", \"original\")]\n        result = reconcile(statement, ledger)\n>       assert pairs(result) == {match([\"s\"], [\"refund\"], \"R3\")}\nE       AssertionError: assert {(frozenset({...ent'}), 'R1')} == {(frozenset({...und'}), 'R3')}\nE         \nE         Extra items in the left set:\nE         (frozenset({'s'}), frozenset({'payment'}), 'R1')\nE         Extra items in the right set:\nE         (frozenset({'s'}), frozenset({'refund'}), 'R3')\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_recon.py:61: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_tlbsilfh\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_recon.py::test_refund_kind_and_original_reference\n1 failed, 17 passed in 0.33s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 1,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_unbalanced_rejected",
        "test_hidden::test_ticket_example_post_then_reverse"
      ],
      "must_fail_hit": [],
      "duration_s": 1.118,
      "stderr_tail": ".FF                                                                      [100%]\n================================== FAILURES ===================================\n__________________________ test_unbalanced_rejected ___________________________\n\n    def test_unbalanced_rejected():\n        s, a, b = accounts()\n>       with pytest.raises(UnbalancedTransaction):\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'ledger.models.UnbalancedTransaction'>\n\n..\\grader\\test_hidden.py:23: Failed\n____________________ test_ticket_example_post_then_reverse ____________________\n\n    def test_ticket_example_post_then_reverse():\n        s, cash, revenue = accounts()\n        txn = s.post([Line(cash, \"debit\", 5000), Line(revenue, \"credit\", 5000)], \"sale\")\n        assert (s.balance(cash), s.balance(revenue)) == (5000, -5000)\n>       reversal = s.reverse(txn, \"undo sale\")\n                   ^^^^^^^^^\nE       AttributeError: 'LedgerService' object has no attribute 'reverse'\n\n..\\grader\\test_hidden.py:31: AttributeError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_gyz7sdfc\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_unbalanced_rejected - Failed: DID NOT R...\nFAILED ..\\grader\\test_hidden.py::test_ticket_example_post_then_reverse - Attr...\n2 failed, 1 passed in 0.46s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 12,
        "failed": 7,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_ledger::test_cross_currency_cannot_net",
        "test_hidden_ledger::test_unknown_account_is_atomic",
        "test_hidden_ledger::test_reverse_once",
        "test_hidden_ledger::test_rejections_leave_no_trace",
        "test_hidden_ledger::test_post_validation_priority[lines3-UnknownAccount]",
        "test_hidden_ledger::test_concurrent_reversals_once",
        "test_hidden_ledger.TestJournal::runTest"
      ],
      "must_fail_hit": [],
      "duration_s": 9.309,
      "stderr_tail": "\nself = <hypothesis.stateful.JournalMachine.TestCase testMethod=runTest>\n\n    def runTest(self):\n>       run_state_machine_as_test(cls, settings=self.settings)\n\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:507: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:271: in run_state_machine_as_test\n    state_machine_test()\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:122: in run_state_machine\n    @given(st.data())\n               ^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nself = JournalMachine({})\n\n    @invariant()\n    def balances_match_model(self):\n        for currency, codes in self.accounts.items():\n            assert sum(self.model[a] for a in codes) == 0, currency\n>       assert all(debit == credit for debit, credit in self.service.trial_balance().values())\nE       assert False\nE        +  where False = all(<generator object JournalMachine.balances_match_model.<locals>.<genexpr> at 0x0000026685877840>)\nE       Failing test case: <state machine>\nE       state = JournalMachine()\nE       state.balances_match_model()\nE       state.teardown()\n\n..\\grader\\test_hidden_ledger.py:222: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_24yu533b\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_ledger.py::test_cross_currency_cannot_net - Fail...\nFAILED ..\\grader\\test_hidden_ledger.py::test_unknown_account_is_atomic - psyc...\nFAILED ..\\grader\\test_hidden_ledger.py::test_reverse_once - AttributeError: '...\nFAILED ..\\grader\\test_hidden_ledger.py::test_rejections_leave_no_trace - Fail...\nFAILED ..\\grader\\test_hidden_ledger.py::test_post_validation_priority[lines3-UnknownAccount]\nFAILED ..\\grader\\test_hidden_ledger.py::test_concurrent_reversals_once - Attr...\nFAILED ..\\grader\\test_hidden_ledger.py::TestJournal::runTest - assert False\n7 failed, 12 passed in 8.58s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.24,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_jfemhk6p\\junit.xml -\n3 passed in 0.45s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 19,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 25.485,
      "stderr_tail": "...................                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_kfud9fmy\\junit.xml -\n19 passed in 24.12s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.576,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_e2n36hoa\\junit.xml -\n3 passed in 0.74s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 19,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 24.442,
      "stderr_tail": "...................                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_7domehq8\\junit.xml -\n19 passed in 23.08s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "wrong_cross_currency_sum",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.835,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_05hj496m\\junit.xml -\n3 passed in 0.73s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "wrong_cross_currency_sum",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 17,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_ledger::test_cross_currency_cannot_net",
        "test_hidden_ledger.TestJournal::runTest"
      ],
      "must_fail_hit": [
        "test_cross_currency_cannot_net"
      ],
      "duration_s": 12.754,
      "stderr_tail": "             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'ledger.models.UnbalancedTransaction'>\n\n..\\grader\\test_hidden_ledger.py:26: Failed\n_____________________________ TestJournal.runTest _____________________________\n\nself = <hypothesis.stateful.JournalMachine.TestCase testMethod=runTest>\n\n    def runTest(self):\n>       run_state_machine_as_test(cls, settings=self.settings)\n\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:507: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:271: in run_state_machine_as_test\n    state_machine_test()\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:122: in run_state_machine\n    @given(st.data())\n               ^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nself = JournalMachine({})\n\n    @invariant()\n    def balances_match_model(self):\n        for currency, codes in self.accounts.items():\n            assert sum(self.model[a] for a in codes) == 0, currency\n>       assert all(debit == credit for debit, credit in self.service.trial_balance().values())\nE       assert False\nE        +  where False = all(<generator object JournalMachine.balances_match_model.<locals>.<genexpr> at 0x0000026264B68D60>)\nE       Failing test case: <state machine>\nE       state = JournalMachine()\nE       state.balances_match_model()\nE       state.teardown()\n\n..\\grader\\test_hidden_ledger.py:222: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_qodvmnyo\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_ledger.py::test_cross_currency_cannot_net - Fail...\nFAILED ..\\grader\\test_hidden_ledger.py::TestJournal::runTest - assert False\n2 failed, 17 passed in 11.75s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "wrong_non_atomic",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.832,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_1mrlk8eu\\junit.xml -\n3 passed in 0.73s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "wrong_non_atomic",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 14,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_ledger::test_cross_currency_cannot_net",
        "test_hidden_ledger::test_unknown_account_is_atomic",
        "test_hidden_ledger::test_rejections_leave_no_trace",
        "test_hidden_ledger::test_concurrent_reversals_once",
        "test_hidden_ledger.TestJournal::runTest"
      ],
      "must_fail_hit": [
        "test_unknown_account_is_atomic"
      ],
      "duration_s": 11.507,
      "stderr_tail": "..\\grader\\test_hidden_ledger.py:163: AssertionError\n_____________________________ TestJournal.runTest _____________________________\n\nself = <hypothesis.stateful.JournalMachine.TestCase testMethod=runTest>\n\n    def runTest(self):\n>       run_state_machine_as_test(cls, settings=self.settings)\n\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:507: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:271: in run_state_machine_as_test\n    state_machine_test()\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:122: in run_state_machine\n    @given(st.data())\n               ^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nself = JournalMachine({})\n\n    @invariant()\n    def balances_match_model(self):\n        for currency, codes in self.accounts.items():\n            assert sum(self.model[a] for a in codes) == 0, currency\n>       assert all(debit == credit for debit, credit in self.service.trial_balance().values())\nE       assert False\nE        +  where False = all(<generator object JournalMachine.balances_match_model.<locals>.<genexpr> at 0x00000250A9464660>)\nE       Failing test case: <state machine>\nE       state = JournalMachine()\nE       state.balances_match_model()\nE       state.teardown()\n\n..\\grader\\test_hidden_ledger.py:222: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_y4bqjzmt\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_ledger.py::test_cross_currency_cannot_net - Asse...\nFAILED ..\\grader\\test_hidden_ledger.py::test_unknown_account_is_atomic - Asse...\nFAILED ..\\grader\\test_hidden_ledger.py::test_rejections_leave_no_trace - Asse...\nFAILED ..\\grader\\test_hidden_ledger.py::test_concurrent_reversals_once - asse...\nFAILED ..\\grader\\test_hidden_ledger.py::TestJournal::runTest - assert False\n5 failed, 14 passed in 10.56s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "wrong_double_reverse",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.804,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_g0vp3js7\\junit.xml -\n3 passed in 0.75s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "05_double_entry",
      "variant": "wrong_double_reverse",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 16,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_ledger::test_reverse_once",
        "test_hidden_ledger::test_concurrent_reversals_once",
        "test_hidden_ledger.TestJournal::runTest"
      ],
      "must_fail_hit": [
        "test_reverse_once"
      ],
      "duration_s": 14.25,
      "stderr_tail": "\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:507: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:271: in run_state_machine_as_test\n    state_machine_test()\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\hypothesis\\stateful.py:122: in run_state_machine\n    @given(st.data())\n               ^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nself = JournalMachine({})\n\n    def teardown(self):\n>       assert {a: self.service.balance(a) for a in self.model} == self.model\nE       AssertionError: assert {'00e9f220dc1...CAD3': 0, ...} == {'00e9f220dc1...CAD3': 0, ...}\nE         \nE         Omitting 6 identical items, use -vv to show\nE         Differing items:\nE         {'00e9f220dc1b4b149b41a859c6e37f54_USD2': 9519} != {'00e9f220dc1b4b149b41a859c6e37f54_USD2': 0}\nE         {'00e9f220dc1b4b149b41a859c6e37f54_USD1': -9519} != {'00e9f220dc1b4b149b41a859c6e37f54_USD1': 0}\nE         Use -v to get more diff\nE       Failing test case: <state machine>\nE       state = JournalMachine()\nE       state.balances_match_model()\nE       state.post_valid(amount=9519, currency='USD', index=1)\nE       state.balances_match_model()\nE       Draw 1: 82\nE       state.reverse(data=data(...))\nE       state.balances_match_model()\nE       Draw 2: 82\nE       state.reverse_again(data=data(...))\nE       state.teardown()\n\n..\\grader\\test_hidden_ledger.py:225: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_mij7c67x\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_ledger.py::test_reverse_once - Failed: DID NOT R...\nFAILED ..\\grader\\test_hidden_ledger.py::test_concurrent_reversals_once - asse...\nFAILED ..\\grader\\test_hidden_ledger.py::TestJournal::runTest - AssertionError...\n3 failed, 16 passed in 13.18s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 1,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_full_capture",
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.522,
      "stderr_tail": "\n    def test_full_capture(tmp_path):\n        client = TestClient(create_app(tmp_path / \"db\", Clock()))\n        result = client.post(\"/accounts/acct_standard/authorizations\", json={\"amount_minor\": 1000})\n        assert result.status_code == 201\n        identifier = result.json()[\"auth_id\"]\n>       assert client.post(f\"/authorizations/{identifier}/capture\", json={\"amount_minor\": 1000}).status_code == 200\nE       AssertionError: assert 404 == 200\nE        +  where 404 = <Response [404 Not Found]>.status_code\nE        +    where <Response [404 Not Found]> = post('/authorizations/ee848892101f4f99acd963dea2d919ba/capture', json={'amount_minor': 1000})\nE        +      where post = <starlette.testclient.TestClient object at 0x00000214E34C96A0>.post\n\n..\\grader\\test_hidden.py:16: AssertionError\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run__8mddxi2/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        client = TestClient(create_app(tmp_path / \"db\", Clock()))\n        identifier = client.post(\"/accounts/acct_standard/authorizations\", json={\"amount_minor\": 3000}).json()[\"auth_id\"]\n>       assert client.get(\"/accounts/acct_standard/balance\").json() == {\"posted_minor\": 10000, \"available_minor\": 7000}\nE       AssertionError: assert {'available_m...minor': 10000} == {'available_m...minor': 10000}\nE         \nE         Omitting 1 identical items, use -vv to show\nE         Differing items:\nE         {'available_minor': 10000} != {'available_minor': 7000}\nE         Use -v to get more diff\n\n..\\grader\\test_hidden.py:23: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run__8mddxi2\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_full_capture - AssertionError: assert 4...\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - AssertionError:...\n2 failed, 1 passed, 1 warning in 0.42s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 12,
        "passed": 1,
        "failed": 11,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_holds::test_existing_holds_reduce_available",
        "test_hidden_holds::test_partial_capture_releases_remainder",
        "test_hidden_holds::test_expiry_exactly_seven_days",
        "test_hidden_holds::test_void_overcapture_and_persistence",
        "test_hidden_holds::test_overdraft_boundary",
        "test_hidden_holds::test_capture_amount_validation_before_closed_status[active]",
        "test_hidden_holds::test_capture_amount_validation_before_closed_status[voided]",
        "test_hidden_holds::test_capture_amount_validation_before_closed_status[captured]",
        "test_hidden_holds::test_capture_amount_validation_before_closed_status[expired]",
        "test_hidden_holds::test_authorization_validation_and_unknown_ids",
        "test_hidden_holds::test_random_operation_model"
      ],
      "must_fail_hit": [],
      "duration_s": 2.496,
      "stderr_tail": "                        elif operation == \"capture\" and value > held:\n                            assert result.status_code == 422\n                        else:\n                            assert result.status_code == 200\n                            holds[id][2] = True\n                            if operation == \"capture\":\n                                posted -= value\n>                   assert balance(client, account) == {\"posted_minor\": posted, \"available_minor\": posted - active()}\nE                   AssertionError: assert {'available_m...minor': 10000} == {'available_m...minor': 10000}\nE                     \nE                     Omitting 1 identical items, use -vv to show\nE                     Differing items:\nE                     {'available_minor': 10000} != {'available_minor': 9900}\nE                     Use -v to get more diff\nE                   Failing explicit example: test_random_operation_model(\nE                       flex=False,\nE                       operations=[('authorize', 100, 0), ('void', 1, 0), ('capture', 101, 0)],\nE                   )\n\n..\\grader\\test_hidden_holds.py:176: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_txh_vwdr\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_holds.py::test_existing_holds_reduce_available\nFAILED ..\\grader\\test_hidden_holds.py::test_partial_capture_releases_remainder\nFAILED ..\\grader\\test_hidden_holds.py::test_expiry_exactly_seven_days - asser...\nFAILED ..\\grader\\test_hidden_holds.py::test_void_overcapture_and_persistence\nFAILED ..\\grader\\test_hidden_holds.py::test_overdraft_boundary - AssertionErr...\nFAILED ..\\grader\\test_hidden_holds.py::test_capture_amount_validation_before_closed_status[active]\nFAILED ..\\grader\\test_hidden_holds.py::test_capture_amount_validation_before_closed_status[voided]\nFAILED ..\\grader\\test_hidden_holds.py::test_capture_amount_validation_before_closed_status[captured]\nFAILED ..\\grader\\test_hidden_holds.py::test_capture_amount_validation_before_closed_status[expired]\nFAILED ..\\grader\\test_hidden_holds.py::test_authorization_validation_and_unknown_ids\nFAILED ..\\grader\\test_hidden_holds.py::test_random_operation_model - Assertio...\n11 failed, 1 passed, 1 warning in 1.63s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.169,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_c1_99e37\\junit.xml -\n3 passed, 1 warning in 0.38s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 12,
        "passed": 12,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 7.002,
      "stderr_tail": "............                                                             [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_bcpsz0w9\\junit.xml -\n12 passed, 1 warning in 6.36s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.914,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_x2y_gfhz\\junit.xml -\n3 passed, 1 warning in 0.96s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 12,
        "passed": 12,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 7.506,
      "stderr_tail": "............                                                             [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_v6c5a8xv\\junit.xml -\n12 passed, 1 warning in 6.24s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "wrong_available_ignores_holds",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.727,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_gi3g8o50/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        client = TestClient(create_app(tmp_path / \"db\", Clock()))\n        identifier = client.post(\"/accounts/acct_standard/authorizations\", json={\"amount_minor\": 3000}).json()[\"auth_id\"]\n>       assert client.get(\"/accounts/acct_standard/balance\").json() == {\"posted_minor\": 10000, \"available_minor\": 7000}\nE       AssertionError: assert {'available_m...minor': 10000} == {'available_m...minor': 10000}\nE         \nE         Omitting 1 identical items, use -vv to show\nE         Differing items:\nE         {'available_minor': 10000} != {'available_minor': 7000}\nE         Use -v to get more diff\n\n..\\grader\\test_hidden.py:23: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_gi3g8o50\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - AssertionError:...\n1 failed, 2 passed, 1 warning in 0.82s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "wrong_available_ignores_holds",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 12,
        "passed": 7,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_holds::test_existing_holds_reduce_available",
        "test_hidden_holds::test_expiry_exactly_seven_days",
        "test_hidden_holds::test_void_overcapture_and_persistence",
        "test_hidden_holds::test_overdraft_boundary",
        "test_hidden_holds::test_random_operation_model"
      ],
      "must_fail_hit": [
        "test_existing_holds_reduce_available"
      ],
      "duration_s": 3.064,
      "stderr_tail": "                        id = list(holds)[index % len(holds)]\n                        held, at, closed = holds[id]\n                        args = {\"json\": {\"amount_minor\": value}} if operation == \"capture\" else {}\n                        result = client.post(f\"/authorizations/{id}/{operation}\", **args)\n                        if closed or clock.at >= at + timedelta(days=7):\n                            assert result.status_code == 409\n                        elif operation == \"capture\" and value > held:\n                            assert result.status_code == 422\n                        else:\n                            assert result.status_code == 200\n                            holds[id][2] = True\n                            if operation == \"capture\":\n                                posted -= value\n>                   assert balance(client, account) == {\"posted_minor\": posted, \"available_minor\": posted - active()}\nE                   AssertionError: assert {'available_m...minor': 10000} == {'available_m...minor': 10000}\nE                     \nE                     Omitting 1 identical items, use -vv to show\nE                     Differing items:\nE                     {'available_minor': 10000} != {'available_minor': 9900}\nE                     Use -v to get more diff\nE                   Failing explicit example: test_random_operation_model(\nE                       flex=False,\nE                       operations=[('authorize', 100, 0), ('void', 1, 0), ('capture', 101, 0)],\nE                   )\n\n..\\grader\\test_hidden_holds.py:176: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_gbl0mqkj\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_holds.py::test_existing_holds_reduce_available\nFAILED ..\\grader\\test_hidden_holds.py::test_expiry_exactly_seven_days - asser...\nFAILED ..\\grader\\test_hidden_holds.py::test_void_overcapture_and_persistence\nFAILED ..\\grader\\test_hidden_holds.py::test_overdraft_boundary - AssertionErr...\nFAILED ..\\grader\\test_hidden_holds.py::test_random_operation_model - Assertio...\n5 failed, 7 passed, 1 warning in 2.10s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "wrong_partial_capture_keeps_remainder",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.705,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_zjxtelld/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        client = TestClient(create_app(tmp_path / \"db\", Clock()))\n        identifier = client.post(\"/accounts/acct_standard/authorizations\", json={\"amount_minor\": 3000}).json()[\"auth_id\"]\n        assert client.get(\"/accounts/acct_standard/balance\").json() == {\"posted_minor\": 10000, \"available_minor\": 7000}\n        assert client.post(f\"/authorizations/{identifier}/capture\", json={\"amount_minor\": 1200}).status_code == 200\n>       assert client.get(\"/accounts/acct_standard/balance\").json() == {\"posted_minor\": 8800, \"available_minor\": 8800}\nE       AssertionError: assert {'available_m..._minor': 8800} == {'available_m..._minor': 8800}\nE         \nE         Omitting 1 identical items, use -vv to show\nE         Differing items:\nE         {'available_minor': 7000} != {'available_minor': 8800}\nE         Use -v to get more diff\n\n..\\grader\\test_hidden.py:25: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_zjxtelld\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - AssertionError:...\n1 failed, 2 passed, 1 warning in 0.79s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "wrong_partial_capture_keeps_remainder",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 12,
        "passed": 9,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_holds::test_partial_capture_releases_remainder",
        "test_hidden_holds::test_capture_amount_validation_before_closed_status[captured]",
        "test_hidden_holds::test_random_operation_model"
      ],
      "must_fail_hit": [
        "test_partial_capture_releases_remainder"
      ],
      "duration_s": 4.512,
      "stderr_tail": "                        elif operation == \"capture\" and value > held:\n                            assert result.status_code == 422\n                        else:\n                            assert result.status_code == 200\n                            holds[id][2] = True\n                            if operation == \"capture\":\n                                posted -= value\n>                   assert balance(client, account) == {\"posted_minor\": posted, \"available_minor\": posted - active()}\nE                   AssertionError: assert {'available_m..._minor': 9713} == {'available_m..._minor': 9713}\nE                     \nE                     Omitting 1 identical items, use -vv to show\nE                     Differing items:\nE                     {'available_minor': 9016} != {'available_minor': 9360}\nE                     Use -v to get more diff\nE                   Failing test case: test_random_operation_model(\nE                       flex=False,\nE                       operations=[('void', 11093, 11),\nE                        ('authorize', 1303, 12),\nE                        ('void', 402, 0),\nE                        ('capture', 2133, 34),\nE                        ('authorize', 353, 40),\nE                        ('authorize', 631, 48),\nE                        ('capture', 392, 27),\nE                        ('capture', 287, 41),\nE                        ('authorize', 66, 9)],\nE                   )\n\n..\\grader\\test_hidden_holds.py:176: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_tlnx_lkl\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_holds.py::test_partial_capture_releases_remainder\nFAILED ..\\grader\\test_hidden_holds.py::test_capture_amount_validation_before_closed_status[captured]\nFAILED ..\\grader\\test_hidden_holds.py::test_random_operation_model - Assertio...\n3 failed, 9 passed, 1 warning in 3.64s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "wrong_expired_holds_count",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.707,
      "stderr_tail": "...                                                                      [100%]\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_e1d247e1\\junit.xml -\n3 passed, 1 warning in 0.85s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "06_available_balance",
      "variant": "wrong_expired_holds_count",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 12,
        "passed": 11,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_holds::test_expiry_exactly_seven_days"
      ],
      "must_fail_hit": [
        "test_expiry_exactly_seven_days"
      ],
      "duration_s": 6.958,
      "stderr_tail": "..F.........                                                             [100%]\n================================== FAILURES ===================================\n_______________________ test_expiry_exactly_seven_days ________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_o8dgbwys/pytest-tmp/test_expiry_exactly_seven_days0')\n\n    def test_expiry_exactly_seven_days(tmp_path):\n        clock = Clock()\n        with TestClient(create_app(tmp_path / \"db\", clock)) as client:\n            id = authorize(client, 1000).json()[\"auth_id\"]\n            clock.at += timedelta(days=7) - timedelta(microseconds=1)\n            assert balance(client)[\"available_minor\"] == 9000\n            clock.at += timedelta(microseconds=1)\n>           assert balance(client) == {\"posted_minor\": 10000, \"available_minor\": 10000}\nE           AssertionError: assert {'available_m...minor': 10000} == {'available_m...minor': 10000}\nE             \nE             Omitting 1 identical items, use -vv to show\nE             Differing items:\nE             {'available_minor': 9000} != {'available_minor': 10000}\nE             Use -v to get more diff\n\n..\\grader\\test_hidden_holds.py:56: AssertionError\n============================== warnings summary ===============================\n..\\..\\..\\..\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1\n  C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python314\\Lib\\site-packages\\fastapi\\testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.\n    from starlette.testclient import TestClient as TestClient  # noqa\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_o8dgbwys\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_holds.py::test_expiry_exactly_seven_days - Asser...\n1 failed, 11 passed, 1 warning in 6.04s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example_toronto_january"
      ],
      "must_fail_hit": [],
      "duration_s": 0.785,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________ test_ticket_worked_example_toronto_january __________________\n\n    def test_ticket_worked_example_toronto_january():\n        start, end = period_bounds(\"America/Toronto\", 2026, 1)\n>       assert start == datetime(2026, 1, 1, 5, tzinfo=timezone.utc)\nE       assert datetime.datetime(2026, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) == datetime.datetime(2026, 1, 1, 5, 0, tzinfo=datetime.timezone.utc)\nE        +  where datetime.datetime(2026, 1, 1, 5, 0, tzinfo=datetime.timezone.utc) = datetime(2026, 1, 1, 5, tzinfo=datetime.timezone.utc)\nE        +    where datetime.timezone.utc = timezone.utc\n\n..\\grader\\test_hidden.py:12: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_2qfhbcdt\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example_toronto_january\n1 failed, 2 passed in 0.10s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 6,
        "failed": 13,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_periods::test_local_midnight_boundaries[America/Toronto-2026-1-2026-01-01T05:00:00+00:00-2026-02-01T05:00:00+00:00]",
        "test_hidden_periods::test_local_midnight_boundaries[Asia/Kolkata-2026-1-2025-12-31T18:30:00+00:00-2026-01-31T18:30:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]",
        "test_hidden_periods::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]",
        "test_hidden_periods::test_naive_and_instant_order",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args0]",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args1]",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args4]",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args5]",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args6]",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args7]",
        "test_hidden_periods::test_invalid_zone_month_or_year_raises[args8]"
      ],
      "must_fail_hit": [],
      "duration_s": 1.349,
      "stderr_tail": "args = ('UTC', 2026.0, 1)\n\n    @pytest.mark.parametrize(\"args\", [(\"Not/AZone\", 2026, 1), (\"\", 2026, 1), (\"UTC\", 2026, 0), (\"UTC\", 2026, 13),\n                                      (\"UTC\", 1899, 1), (\"UTC\", 2099, 1), (\"UTC\", True, 1), (\"UTC\", 2026, True),\n                                      (\"UTC\", 2026.0, 1)])\n    def test_invalid_zone_month_or_year_raises(args):\n        with pytest.raises(ValueError):\n>           period_bounds(*args)\n\n..\\grader\\test_hidden_periods.py:75: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\nstatements\\period.py:14: in period_bounds\n    start = month_start(timezone.utc, year, month)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\nzone = datetime.timezone.utc, year = 2026.0, month = 1\n\n    def month_start(zone, year, month):\n>       return datetime(year, month, 1, tzinfo=zone)\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       TypeError: 'float' object cannot be interpreted as an integer\n\nstatements\\period.py:6: TypeError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_cmdkp41u\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_periods.py::test_local_midnight_boundaries[America/Toronto-2026-1-2026-01-01T05:00:00+00:00-2026-02-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_local_midnight_boundaries[Asia/Kolkata-2026-1-2025-12-31T18:30:00+00:00-2026-01-31T18:30:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_naive_and_instant_order - Asser...\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args0]\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args1]\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args4]\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args5]\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args6]\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args7]\nFAILED ..\\grader\\test_hidden_periods.py::test_invalid_zone_month_or_year_raises[args8]\n13 failed, 6 passed in 0.63s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.714,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_gvnhounk\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 19,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.187,
      "stderr_tail": "...................                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_re9kpebd\\junit.xml -\n19 passed in 0.47s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.756,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_reqviya0\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 19,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.26,
      "stderr_tail": "...................                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_5w8zbb5u\\junit.xml -\n19 passed in 0.50s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "wrong_utc_month",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example_toronto_january"
      ],
      "must_fail_hit": [],
      "duration_s": 0.867,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________ test_ticket_worked_example_toronto_january __________________\n\n    def test_ticket_worked_example_toronto_january():\n        start, end = period_bounds(\"America/Toronto\", 2026, 1)\n>       assert start == datetime(2026, 1, 1, 5, tzinfo=timezone.utc)\nE       assert datetime.datetime(2026, 1, 1, 0, 0, tzinfo=datetime.timezone.utc) == datetime.datetime(2026, 1, 1, 5, 0, tzinfo=datetime.timezone.utc)\nE        +  where datetime.datetime(2026, 1, 1, 5, 0, tzinfo=datetime.timezone.utc) = datetime(2026, 1, 1, 5, tzinfo=datetime.timezone.utc)\nE        +    where datetime.timezone.utc = timezone.utc\n\n..\\grader\\test_hidden.py:12: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_xx6rijdg\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example_toronto_january\n1 failed, 2 passed in 0.11s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "wrong_utc_month",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 14,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_periods::test_local_midnight_boundaries[America/Toronto-2026-1-2026-01-01T05:00:00+00:00-2026-02-01T05:00:00+00:00]",
        "test_hidden_periods::test_local_midnight_boundaries[Asia/Kolkata-2026-1-2025-12-31T18:30:00+00:00-2026-01-31T18:30:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]",
        "test_hidden_periods::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]"
      ],
      "must_fail_hit": [
        "test_local_midnight_boundaries"
      ],
      "duration_s": 1.335,
      "stderr_tail": "        (\"America/Toronto\", 3, \"2026-03-01T05:00:00+00:00\", \"2026-04-01T04:00:00+00:00\"),\n        (\"America/Toronto\", 11, \"2026-11-01T04:00:00+00:00\", \"2026-12-01T05:00:00+00:00\"),\n        (\"Pacific/Auckland\", 4, \"2026-03-31T11:00:00+00:00\", \"2026-04-30T12:00:00+00:00\"),\n    ])\n    def test_dst_months(zone, month, start, end):\n        left, right = datetime.fromisoformat(start), datetime.fromisoformat(end)\n>       assert period_bounds(zone, 2026, month) == (left, right)\nE       assert (datetime.dat...timezone.utc)) == (datetime.dat...timezone.utc))\nE         \nE         At index 0 diff: datetime.datetime(2026, 11, 1, 0, 0, tzinfo=datetime.timezone.utc) != datetime.datetime(2026, 11, 1, 4, 0, tzinfo=datetime.timezone.utc)\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_periods.py:32: AssertionError\n_ test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00] _\n\nzone = 'Pacific/Auckland', month = 4, start = '2026-03-31T11:00:00+00:00'\nend = '2026-04-30T12:00:00+00:00'\n\n    @pytest.mark.parametrize(\"zone,month,start,end\", [\n        (\"America/Toronto\", 3, \"2026-03-01T05:00:00+00:00\", \"2026-04-01T04:00:00+00:00\"),\n        (\"America/Toronto\", 11, \"2026-11-01T04:00:00+00:00\", \"2026-12-01T05:00:00+00:00\"),\n        (\"Pacific/Auckland\", 4, \"2026-03-31T11:00:00+00:00\", \"2026-04-30T12:00:00+00:00\"),\n    ])\n    def test_dst_months(zone, month, start, end):\n        left, right = datetime.fromisoformat(start), datetime.fromisoformat(end)\n>       assert period_bounds(zone, 2026, month) == (left, right)\nE       assert (datetime.dat...timezone.utc)) == (datetime.dat...timezone.utc))\nE         \nE         At index 0 diff: datetime.datetime(2026, 4, 1, 0, 0, tzinfo=datetime.timezone.utc) != datetime.datetime(2026, 3, 31, 11, 0, tzinfo=datetime.timezone.utc)\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_periods.py:32: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_b26hrslr\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_periods.py::test_local_midnight_boundaries[America/Toronto-2026-1-2026-01-01T05:00:00+00:00-2026-02-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_local_midnight_boundaries[Asia/Kolkata-2026-1-2025-12-31T18:30:00+00:00-2026-01-31T18:30:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]\n5 failed, 14 passed in 0.59s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "wrong_offset_sign",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example_toronto_january"
      ],
      "must_fail_hit": [],
      "duration_s": 0.888,
      "stderr_tail": ".F.                                                                      [100%]\n================================== FAILURES ===================================\n_________________ test_ticket_worked_example_toronto_january __________________\n\n    def test_ticket_worked_example_toronto_january():\n        start, end = period_bounds(\"America/Toronto\", 2026, 1)\n>       assert start == datetime(2026, 1, 1, 5, tzinfo=timezone.utc)\nE       assert datetime.datetime(2025, 12, 31, 19, 0, tzinfo=datetime.timezone.utc) == datetime.datetime(2026, 1, 1, 5, 0, tzinfo=datetime.timezone.utc)\nE        +  where datetime.datetime(2026, 1, 1, 5, 0, tzinfo=datetime.timezone.utc) = datetime(2026, 1, 1, 5, tzinfo=datetime.timezone.utc)\nE        +    where datetime.timezone.utc = timezone.utc\n\n..\\grader\\test_hidden.py:12: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_7poipnuc\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example_toronto_january\n1 failed, 2 passed in 0.13s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "wrong_offset_sign",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 14,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_periods::test_local_midnight_boundaries[America/Toronto-2026-1-2026-01-01T05:00:00+00:00-2026-02-01T05:00:00+00:00]",
        "test_hidden_periods::test_local_midnight_boundaries[Asia/Kolkata-2026-1-2025-12-31T18:30:00+00:00-2026-01-31T18:30:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]",
        "test_hidden_periods::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]"
      ],
      "must_fail_hit": [
        "test_local_midnight_boundaries",
        "test_dst_months"
      ],
      "duration_s": 1.402,
      "stderr_tail": "        (\"America/Toronto\", 3, \"2026-03-01T05:00:00+00:00\", \"2026-04-01T04:00:00+00:00\"),\n        (\"America/Toronto\", 11, \"2026-11-01T04:00:00+00:00\", \"2026-12-01T05:00:00+00:00\"),\n        (\"Pacific/Auckland\", 4, \"2026-03-31T11:00:00+00:00\", \"2026-04-30T12:00:00+00:00\"),\n    ])\n    def test_dst_months(zone, month, start, end):\n        left, right = datetime.fromisoformat(start), datetime.fromisoformat(end)\n>       assert period_bounds(zone, 2026, month) == (left, right)\nE       assert (datetime.dat...timezone.utc)) == (datetime.dat...timezone.utc))\nE         \nE         At index 0 diff: datetime.datetime(2026, 10, 31, 20, 0, tzinfo=datetime.timezone.utc) != datetime.datetime(2026, 11, 1, 4, 0, tzinfo=datetime.timezone.utc)\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_periods.py:32: AssertionError\n_ test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00] _\n\nzone = 'Pacific/Auckland', month = 4, start = '2026-03-31T11:00:00+00:00'\nend = '2026-04-30T12:00:00+00:00'\n\n    @pytest.mark.parametrize(\"zone,month,start,end\", [\n        (\"America/Toronto\", 3, \"2026-03-01T05:00:00+00:00\", \"2026-04-01T04:00:00+00:00\"),\n        (\"America/Toronto\", 11, \"2026-11-01T04:00:00+00:00\", \"2026-12-01T05:00:00+00:00\"),\n        (\"Pacific/Auckland\", 4, \"2026-03-31T11:00:00+00:00\", \"2026-04-30T12:00:00+00:00\"),\n    ])\n    def test_dst_months(zone, month, start, end):\n        left, right = datetime.fromisoformat(start), datetime.fromisoformat(end)\n>       assert period_bounds(zone, 2026, month) == (left, right)\nE       assert (datetime.dat...timezone.utc)) == (datetime.dat...timezone.utc))\nE         \nE         At index 0 diff: datetime.datetime(2026, 4, 1, 13, 0, tzinfo=datetime.timezone.utc) != datetime.datetime(2026, 3, 31, 11, 0, tzinfo=datetime.timezone.utc)\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_periods.py:32: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_m9f6qub6\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_periods.py::test_local_midnight_boundaries[America/Toronto-2026-1-2026-01-01T05:00:00+00:00-2026-02-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_local_midnight_boundaries[Asia/Kolkata-2026-1-2025-12-31T18:30:00+00:00-2026-01-31T18:30:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]\n5 failed, 14 passed in 0.59s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "wrong_fixed_offset",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.752,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_d1ppp7ar\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "07_statement_periods",
      "variant": "wrong_fixed_offset",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 16,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_periods::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]",
        "test_hidden_periods::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]",
        "test_hidden_periods::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]"
      ],
      "must_fail_hit": [
        "test_dst_months"
      ],
      "duration_s": 1.349,
      "stderr_tail": "\n    @pytest.mark.parametrize(\"zone,month,start,end\", [\n        (\"America/Toronto\", 3, \"2026-03-01T05:00:00+00:00\", \"2026-04-01T04:00:00+00:00\"),\n        (\"America/Toronto\", 11, \"2026-11-01T04:00:00+00:00\", \"2026-12-01T05:00:00+00:00\"),\n        (\"Pacific/Auckland\", 4, \"2026-03-31T11:00:00+00:00\", \"2026-04-30T12:00:00+00:00\"),\n    ])\n    def test_dst_months(zone, month, start, end):\n        left, right = datetime.fromisoformat(start), datetime.fromisoformat(end)\n>       assert period_bounds(zone, 2026, month) == (left, right)\nE       assert (datetime.dat...timezone.utc)) == (datetime.dat...timezone.utc))\nE         \nE         At index 0 diff: datetime.datetime(2026, 11, 1, 5, 0, tzinfo=datetime.timezone.utc) != datetime.datetime(2026, 11, 1, 4, 0, tzinfo=datetime.timezone.utc)\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_periods.py:32: AssertionError\n_ test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00] _\n\nzone = 'Pacific/Auckland', month = 4, start = '2026-03-31T11:00:00+00:00'\nend = '2026-04-30T12:00:00+00:00'\n\n    @pytest.mark.parametrize(\"zone,month,start,end\", [\n        (\"America/Toronto\", 3, \"2026-03-01T05:00:00+00:00\", \"2026-04-01T04:00:00+00:00\"),\n        (\"America/Toronto\", 11, \"2026-11-01T04:00:00+00:00\", \"2026-12-01T05:00:00+00:00\"),\n        (\"Pacific/Auckland\", 4, \"2026-03-31T11:00:00+00:00\", \"2026-04-30T12:00:00+00:00\"),\n    ])\n    def test_dst_months(zone, month, start, end):\n        left, right = datetime.fromisoformat(start), datetime.fromisoformat(end)\n>       assert period_bounds(zone, 2026, month) == (left, right)\nE       assert (datetime.dat...timezone.utc)) == (datetime.dat...timezone.utc))\nE         \nE         At index 0 diff: datetime.datetime(2026, 3, 31, 12, 0, tzinfo=datetime.timezone.utc) != datetime.datetime(2026, 3, 31, 11, 0, tzinfo=datetime.timezone.utc)\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_periods.py:32: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_txppj_j7\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-3-2026-03-01T05:00:00+00:00-2026-04-01T04:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[America/Toronto-11-2026-11-01T04:00:00+00:00-2026-12-01T05:00:00+00:00]\nFAILED ..\\grader\\test_hidden_periods.py::test_dst_months[Pacific/Auckland-4-2026-03-31T11:00:00+00:00-2026-04-30T12:00:00+00:00]\n3 failed, 16 passed in 0.62s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 2,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_over_refund_rejected",
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.288,
      "stderr_tail": ".FF.                                                                     [100%]\n================================== FAILURES ===================================\n__________________________ test_over_refund_rejected __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_cwf3n3g5/pytest-tmp/test_over_refund_rejected0')\n\n    def test_over_refund_rejected(tmp_path):\n        s = RefundService(tmp_path / \"db\")\n        p = s.create_payment(100)\n        s.capture(p, 100)\n>       with pytest.raises(RefundExceedsCaptured):\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\n\n..\\grader\\test_hidden.py:17: Failed\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_cwf3n3g5/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        s = RefundService(tmp_path / \"db\")\n        p = s.create_payment(10000)\n        s.capture(p, 6000)\n        assert s.refund(p, 4000) > 0\n        assert s.refunded_total(p) == 4000\n>       with pytest.raises(RefundExceedsCaptured):\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\n\n..\\grader\\test_hidden.py:27: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_cwf3n3g5\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_over_refund_rejected - Failed: DID NOT ...\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - Failed: DID NOT...\n2 failed, 2 passed in 0.56s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 8,
        "passed": 1,
        "failed": 7,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_refunds::test_cumulative_partials",
        "test_hidden_refunds::test_capture_less_than_authorization",
        "test_hidden_refunds::test_valid_after_rejection",
        "test_hidden_refunds::test_unknown_payment_id_raises_value_error",
        "test_hidden_refunds::test_capture_once_and_within_authorization",
        "test_hidden_refunds::test_concurrent_refunds_respect_budget",
        "test_hidden_refunds::test_refund_sequence_matches_greedy_oracle"
      ],
      "must_fail_hit": [],
      "duration_s": 2.75,
      "stderr_tail": "\n..\\grader\\test_hidden_refunds.py:118: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\ncapture = 714, extra = 8317, attempts = [9423, 1453, 200, 14504]\n\n    @settings(max_examples=40)\n    @given(capture=st.integers(1, 100000), extra=st.integers(0, 100000),\n           attempts=st.lists(st.integers(1, 100000), max_size=30))\n    def test_refund_sequence_matches_greedy_oracle(capture, extra, attempts):\n        with workspace() as path:\n            s, p = payment(path, capture + extra, capture)\n            total, identifiers = 0, set()\n            for amount in attempts:\n                if amount <= capture - total:\n                    identifier = s.refund(p, amount)\n                    assert type(identifier) is int and identifier > 0 and identifier not in identifiers\n                    identifiers.add(identifier)\n                    total += amount\n                else:\n>                   with pytest.raises(RefundExceedsCaptured):\n                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE                   Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\nE                   Failing test case: test_refund_sequence_matches_greedy_oracle(\nE                       capture=714,\nE                       extra=8317,\nE                       attempts=[9423, 1453, 200, 14504],\nE                   )\n\n..\\grader\\test_hidden_refunds.py:131: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_1oclmu7v\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_refunds.py::test_cumulative_partials - Failed: D...\nFAILED ..\\grader\\test_hidden_refunds.py::test_capture_less_than_authorization\nFAILED ..\\grader\\test_hidden_refunds.py::test_valid_after_rejection - Failed:...\nFAILED ..\\grader\\test_hidden_refunds.py::test_unknown_payment_id_raises_value_error\nFAILED ..\\grader\\test_hidden_refunds.py::test_capture_once_and_within_authorization\nFAILED ..\\grader\\test_hidden_refunds.py::test_concurrent_refunds_respect_budget\nFAILED ..\\grader\\test_hidden_refunds.py::test_refund_sequence_matches_greedy_oracle\n7 failed, 1 passed in 2.06s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.304,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_bj3rj1um\\junit.xml -\n4 passed in 0.48s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 8,
        "passed": 8,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 11.696,
      "stderr_tail": "........                                                                 [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_1v3skvox\\junit.xml -\n8 passed in 10.92s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 4,
        "passed": 4,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.041,
      "stderr_tail": "....                                                                     [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_nyuc18t1\\junit.xml -\n4 passed in 0.26s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 8,
        "passed": 8,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 11.034,
      "stderr_tail": "........                                                                 [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_5o9cp5jn\\junit.xml -\n8 passed in 10.25s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "wrong_checks_single_refund",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 4,
        "passed": 3,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.42,
      "stderr_tail": "..F.                                                                     [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_ef7ocd11/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        s = RefundService(tmp_path / \"db\")\n        p = s.create_payment(10000)\n        s.capture(p, 6000)\n        assert s.refund(p, 4000) > 0\n        assert s.refunded_total(p) == 4000\n>       with pytest.raises(RefundExceedsCaptured):\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\n\n..\\grader\\test_hidden.py:27: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_ef7ocd11\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - Failed: DID NOT...\n1 failed, 3 passed in 0.52s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "wrong_checks_single_refund",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 8,
        "passed": 4,
        "failed": 4,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_refunds::test_cumulative_partials",
        "test_hidden_refunds::test_capture_once_and_within_authorization",
        "test_hidden_refunds::test_concurrent_refunds_respect_budget",
        "test_hidden_refunds::test_refund_sequence_matches_greedy_oracle"
      ],
      "must_fail_hit": [
        "test_cumulative_partials"
      ],
      "duration_s": 3.245,
      "stderr_tail": ">   @given(capture=st.integers(1, 100000), extra=st.integers(0, 100000),\n                   ^^^\n           attempts=st.lists(st.integers(1, 100000), max_size=30))\n\n..\\grader\\test_hidden_refunds.py:118: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\ncapture = 627, extra = 0, attempts = [11160, 271, 461, 2299, 65535, 1384, ...]\n\n    @settings(max_examples=40)\n    @given(capture=st.integers(1, 100000), extra=st.integers(0, 100000),\n           attempts=st.lists(st.integers(1, 100000), max_size=30))\n    def test_refund_sequence_matches_greedy_oracle(capture, extra, attempts):\n        with workspace() as path:\n            s, p = payment(path, capture + extra, capture)\n            total, identifiers = 0, set()\n            for amount in attempts:\n                if amount <= capture - total:\n                    identifier = s.refund(p, amount)\n                    assert type(identifier) is int and identifier > 0 and identifier not in identifiers\n                    identifiers.add(identifier)\n                    total += amount\n                else:\n>                   with pytest.raises(RefundExceedsCaptured):\n                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE                   Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\nE                   Failing test case: test_refund_sequence_matches_greedy_oracle(\nE                       capture=627,\nE                       extra=0,\nE                       attempts=[11160, 271, 461, 2299, 65535, 1384, 4586, 279, 14, 22808, 434],\nE                   )\n\n..\\grader\\test_hidden_refunds.py:131: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_17synlj0\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_refunds.py::test_cumulative_partials - Failed: D...\nFAILED ..\\grader\\test_hidden_refunds.py::test_capture_once_and_within_authorization\nFAILED ..\\grader\\test_hidden_refunds.py::test_concurrent_refunds_respect_budget\nFAILED ..\\grader\\test_hidden_refunds.py::test_refund_sequence_matches_greedy_oracle\n4 failed, 4 passed in 2.45s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "wrong_uses_authorized",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 4,
        "passed": 3,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.395,
      "stderr_tail": "..F.                                                                     [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_f322lvzm/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        s = RefundService(tmp_path / \"db\")\n        p = s.create_payment(10000)\n        s.capture(p, 6000)\n        assert s.refund(p, 4000) > 0\n        assert s.refunded_total(p) == 4000\n>       with pytest.raises(RefundExceedsCaptured):\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\n\n..\\grader\\test_hidden.py:27: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_f322lvzm\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - Failed: DID NOT...\n1 failed, 3 passed in 0.47s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "wrong_uses_authorized",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 8,
        "passed": 5,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_refunds::test_capture_less_than_authorization",
        "test_hidden_refunds::test_capture_once_and_within_authorization",
        "test_hidden_refunds::test_refund_sequence_matches_greedy_oracle"
      ],
      "must_fail_hit": [
        "test_capture_less_than_authorization"
      ],
      "duration_s": 5.242,
      "stderr_tail": "    @settings(max_examples=40)\n>   @given(capture=st.integers(1, 100000), extra=st.integers(0, 100000),\n                   ^^^\n           attempts=st.lists(st.integers(1, 100000), max_size=30))\n\n..\\grader\\test_hidden_refunds.py:118: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\ncapture = 714, extra = 8317, attempts = [9423, 1453, 200, 14504]\n\n    @settings(max_examples=40)\n    @given(capture=st.integers(1, 100000), extra=st.integers(0, 100000),\n           attempts=st.lists(st.integers(1, 100000), max_size=30))\n    def test_refund_sequence_matches_greedy_oracle(capture, extra, attempts):\n        with workspace() as path:\n            s, p = payment(path, capture + extra, capture)\n            total, identifiers = 0, set()\n            for amount in attempts:\n                if amount <= capture - total:\n                    identifier = s.refund(p, amount)\n                    assert type(identifier) is int and identifier > 0 and identifier not in identifiers\n                    identifiers.add(identifier)\n                    total += amount\n                else:\n>                   with pytest.raises(RefundExceedsCaptured):\n                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nE                   Failed: DID NOT RAISE <class 'refunds.models.RefundExceedsCaptured'>\nE                   Failing test case: test_refund_sequence_matches_greedy_oracle(\nE                       capture=714,\nE                       extra=8317,\nE                       attempts=[9423, 1453, 200, 14504],\nE                   )\n\n..\\grader\\test_hidden_refunds.py:131: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_ipkda2on\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_refunds.py::test_capture_less_than_authorization\nFAILED ..\\grader\\test_hidden_refunds.py::test_capture_once_and_within_authorization\nFAILED ..\\grader\\test_hidden_refunds.py::test_refund_sequence_matches_greedy_oracle\n3 failed, 5 passed in 4.40s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "wrong_counts_rejected",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 4,
        "passed": 3,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_ticket_worked_example"
      ],
      "must_fail_hit": [],
      "duration_s": 1.932,
      "stderr_tail": "..F.                                                                     [100%]\n================================== FAILURES ===================================\n_________________________ test_ticket_worked_example __________________________\n\ntmp_path = WindowsPath('C:/Users/User/AppData/Local/Temp/bcp/run_symkqrzo/pytest-tmp/test_ticket_worked_example0')\n\n    def test_ticket_worked_example(tmp_path):\n        s = RefundService(tmp_path / \"db\")\n        p = s.create_payment(10000)\n        s.capture(p, 6000)\n        assert s.refund(p, 4000) > 0\n        assert s.refunded_total(p) == 4000\n        with pytest.raises(RefundExceedsCaptured):\n            s.refund(p, 2500)\n>       assert s.refunded_total(p) == 4000\nE       assert 6500 == 4000\nE        +  where 6500 = refunded_total(1)\nE        +    where refunded_total = <refunds.service.RefundService object at 0x00000182BA376210>.refunded_total\n\n..\\grader\\test_hidden.py:29: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_symkqrzo\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example - assert 6500 == ...\n1 failed, 3 passed in 1.10s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "08_refund_limits",
      "variant": "wrong_counts_rejected",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 8,
        "passed": 3,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_refunds::test_cumulative_partials",
        "test_hidden_refunds::test_capture_less_than_authorization",
        "test_hidden_refunds::test_valid_after_rejection",
        "test_hidden_refunds::test_concurrent_refunds_respect_budget",
        "test_hidden_refunds::test_refund_sequence_matches_greedy_oracle"
      ],
      "must_fail_hit": [
        "test_valid_after_rejection"
      ],
      "duration_s": 2.715,
      "stderr_tail": "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\ncapture = 714, extra = 8317, attempts = [9423, 1453, 200, 14504]\n\n    @settings(max_examples=40)\n    @given(capture=st.integers(1, 100000), extra=st.integers(0, 100000),\n           attempts=st.lists(st.integers(1, 100000), max_size=30))\n    def test_refund_sequence_matches_greedy_oracle(capture, extra, attempts):\n        with workspace() as path:\n            s, p = payment(path, capture + extra, capture)\n            total, identifiers = 0, set()\n            for amount in attempts:\n                if amount <= capture - total:\n                    identifier = s.refund(p, amount)\n                    assert type(identifier) is int and identifier > 0 and identifier not in identifiers\n                    identifiers.add(identifier)\n                    total += amount\n                else:\n                    with pytest.raises(RefundExceedsCaptured):\n                        s.refund(p, amount)\n                s = RefundService(path)\n>               assert s.refunded_total(p) == total <= capture\nE               assert 9423 == 0\nE                +  where 9423 = refunded_total(1)\nE                +    where refunded_total = <refunds.service.RefundService object at 0x0000026EA9F4E6D0>.refunded_total\nE               Failing test case: test_refund_sequence_matches_greedy_oracle(\nE                   capture=714,\nE                   extra=8317,\nE                   attempts=[9423, 1453, 200, 14504],\nE               )\n\n..\\grader\\test_hidden_refunds.py:134: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_i4l_i5yv\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_refunds.py::test_cumulative_partials - assert 12...\nFAILED ..\\grader\\test_hidden_refunds.py::test_capture_less_than_authorization\nFAILED ..\\grader\\test_hidden_refunds.py::test_valid_after_rejection - assert ...\nFAILED ..\\grader\\test_hidden_refunds.py::test_concurrent_refunds_respect_budget\nFAILED ..\\grader\\test_hidden_refunds.py::test_refund_sequence_matches_greedy_oracle\n5 failed, 3 passed in 1.82s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 0,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_tier_midpoints",
        "test_hidden::test_ticket_worked_example_with_clamps",
        "test_hidden::test_negative_amount_rejected"
      ],
      "must_fail_hit": [],
      "duration_s": 0.867,
      "stderr_tail": "FFF                                                                      [100%]\n================================== FAILURES ===================================\n_____________________________ test_tier_midpoints _____________________________\n\n    def test_tier_midpoints():\n        schedule = Schedule([Tier(10000, 100, 10), Tier(20000, 50, 20), Tier(None, 25, 30)], 0, 999999)\n        for amount, expected in [(5000, 60), (15000, 95), (30000, 105)]:\n>           assert compute_fee(amount, schedule) == expected\nE           assert 160 == 95\nE            +  where 160 = compute_fee(15000, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=20000, bps=50, fixed_minor=20), Tier(up_to_minor=None, bps=25, fixed_minor=30)], min_fee_minor=0, max_fee_minor=999999))\n\n..\\grader\\test_hidden.py:8: AssertionError\n___________________ test_ticket_worked_example_with_clamps ____________________\n\n    def test_ticket_worked_example_with_clamps():\n        schedule = Schedule([Tier(10000, 100, 10), Tier(20000, 50, 20), Tier(None, 25, 30)], 25, 100)\n        for amount, expected in [(5000, 60), (15000, 95), (100, 25), (30000, 100)]:\n>           assert compute_fee(amount, schedule) == expected\nE           assert 160 == 95\nE            +  where 160 = compute_fee(15000, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=20000, bps=50, fixed_minor=20), Tier(up_to_minor=None, bps=25, fixed_minor=30)], min_fee_minor=25, max_fee_minor=100))\n\n..\\grader\\test_hidden.py:14: AssertionError\n________________________ test_negative_amount_rejected ________________________\n\n    def test_negative_amount_rejected():\n>       with pytest.raises(ValueError):\n             ^^^^^^^^^^^^^^^^^^^^^^^^^\nE       Failed: DID NOT RAISE <class 'ValueError'>\n\n..\\grader\\test_hidden.py:18: Failed\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_acqc5ve2\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_tier_midpoints - assert 160 == 95\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example_with_clamps - ass...\nFAILED ..\\grader\\test_hidden.py::test_negative_amount_rejected - Failed: DID ...\n3 failed in 0.11s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 0,
        "failed": 19,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fees::test_inclusive_boundaries",
        "test_hidden_fees::test_discovered_float_ties[5000-3-2]",
        "test_hidden_fees::test_discovered_float_ties[25000-3-8]",
        "test_hidden_fees::test_discovered_float_ties[35000-3-11]",
        "test_hidden_fees::test_non_marginal",
        "test_hidden_fees::test_clamps_and_zero",
        "test_hidden_fees::test_fee_properties",
        "test_hidden_fees::test_invalid_schedule_raises_for_any_amount[tiers0-0-100]",
        "test_hidden_fees::test_invalid_schedule_raises_for_any_amount[tiers1-0-100]",
        "test_hidden_fees::test_invalid_schedule_raises_for_any_amount[tiers2-0-100]",
        "test_hidden_fees::test_invalid_schedule_raises_for_any_amount[tiers3-0-100]",
        "test_hidden_fees::test_invalid_schedule_raises_for_any_amount[tiers4-0-100]",
        "test_hidden_fees::test_invalid_schedule_raises_for_any_amount[tiers5-20-10]",
        "test_hidden_fees::test_schedule_revalidated_after_tier_list_mutation",
        "test_hidden_fees::test_invalid_amount_type[True]",
        "test_hidden_fees::test_invalid_amount_type[False]",
        "test_hidden_fees::test_invalid_amount_type[1.5]",
        "test_hidden_fees::test_invalid_amount_type[1]",
        "test_hidden_fees::test_invalid_amount_type[None]"
      ],
      "must_fail_hit": [],
      "duration_s": 1.115,
      "stderr_tail": ">           compute_fee(amount, Schedule([Tier(None, 1, 0)], 0, 100))\n\n..\\grader\\test_hidden_fees.py:81: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\nfees\\schedule.py:10: in compute_fee\n    return raw_fee(amount_minor, schedule.tiers[0])\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\namount_minor = None, tier = Tier(up_to_minor=None, bps=1, fixed_minor=0)\n\n    def raw_fee(amount_minor, tier):\n        \"\"\"Percentage part plus fixed part, in whole minor units.\"\"\"\n>       return amount_minor * tier.bps // 10000 + tier.fixed_minor\n               ^^^^^^^^^^^^^^^^^^^^^^^\nE       TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'\n\nfees\\schedule.py:6: TypeError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_87r1fiji\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fees.py::test_inclusive_boundaries - assert 109 ...\nFAILED ..\\grader\\test_hidden_fees.py::test_discovered_float_ties[5000-3-2] - ...\nFAILED ..\\grader\\test_hidden_fees.py::test_discovered_float_ties[25000-3-8]\nFAILED ..\\grader\\test_hidden_fees.py::test_discovered_float_ties[35000-3-11]\nFAILED ..\\grader\\test_hidden_fees.py::test_non_marginal - assert 160 == 95\nFAILED ..\\grader\\test_hidden_fees.py::test_clamps_and_zero - assert 5 == 10\nFAILED ..\\grader\\test_hidden_fees.py::test_fee_properties - assert 54797 == 5...\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_schedule_raises_for_any_amount[tiers0-0-100]\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_schedule_raises_for_any_amount[tiers1-0-100]\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_schedule_raises_for_any_amount[tiers2-0-100]\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_schedule_raises_for_any_amount[tiers3-0-100]\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_schedule_raises_for_any_amount[tiers4-0-100]\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_schedule_raises_for_any_amount[tiers5-20-10]\nFAILED ..\\grader\\test_hidden_fees.py::test_schedule_revalidated_after_tier_list_mutation\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_amount_type[True] - Failed...\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_amount_type[False] - Faile...\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_amount_type[1.5] - Failed:...\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_amount_type[1] - TypeError...\nFAILED ..\\grader\\test_hidden_fees.py::test_invalid_amount_type[None] - TypeEr...\n19 failed in 0.38s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.763,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_4cgun4xt\\junit.xml -\n3 passed in 0.02s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 19,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.269,
      "stderr_tail": "...................                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_q6z26gvo\\junit.xml -\n19 passed in 0.40s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.713,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_7a6nook1\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 19,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.165,
      "stderr_tail": "...................                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_z6muizsh\\junit.xml -\n19 passed in 0.41s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "wrong_exclusive_boundary",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.773,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_87nh0ep7\\junit.xml -\n3 passed in 0.02s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "wrong_exclusive_boundary",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 18,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fees::test_inclusive_boundaries"
      ],
      "must_fail_hit": [
        "test_inclusive_boundaries"
      ],
      "duration_s": 1.212,
      "stderr_tail": "F..................                                                      [100%]\n================================== FAILURES ===================================\n__________________________ test_inclusive_boundaries __________________________\n\n    def test_inclusive_boundaries():\n        tiers = [Tier(10000, 100, 10), Tier(20000, 50, 20), Tier(None, 25, 30)]\n        schedule = Schedule(tiers, 0, 10**20)\n        for boundary in (10000, 20000):\n            for amount in (boundary - 1, boundary, boundary + 1):\n                tier = next(t for t in tiers if t.up_to_minor is None or amount <= t.up_to_minor)\n>               assert compute_fee(amount, schedule) == expected(amount, tier)\nE               assert 70 == 110\nE                +  where 70 = compute_fee(10000, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=20000, bps=50, fixed_minor=20), Tier(up_to_minor=None, bps=25, fixed_minor=30)], min_fee_minor=0, max_fee_minor=100000000000000000000))\nE                +  and   110 = expected(10000, Tier(up_to_minor=10000, bps=100, fixed_minor=10))\n\n..\\grader\\test_hidden_fees.py:17: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_yyeh9fsb\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fees.py::test_inclusive_boundaries - assert 70 =...\n1 failed, 18 passed in 0.46s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "wrong_float_bps",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.794,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_3ea_u_w3\\junit.xml -\n3 passed in 0.02s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "wrong_float_bps",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 16,
        "failed": 3,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fees::test_discovered_float_ties[5000-3-2]",
        "test_hidden_fees::test_discovered_float_ties[25000-3-8]",
        "test_hidden_fees::test_discovered_float_ties[35000-3-11]"
      ],
      "must_fail_hit": [
        "test_discovered_float_ties"
      ],
      "duration_s": 1.338,
      "stderr_tail": "    def test_discovered_float_ties(amount, bps, want):\n        # Deterministic search results, see tools/rounding_cases.json.\n>       assert compute_fee(amount, Schedule([Tier(None, bps, 0)], 0, 100000)) == want\nE       assert 1 == 2\nE        +  where 1 = compute_fee(5000, Schedule(tiers=[Tier(up_to_minor=None, bps=3, fixed_minor=0)], min_fee_minor=0, max_fee_minor=100000))\nE        +    where Schedule(tiers=[Tier(up_to_minor=None, bps=3, fixed_minor=0)], min_fee_minor=0, max_fee_minor=100000) = Schedule([Tier(up_to_minor=None, bps=3, fixed_minor=0)], 0, 100000)\n\n..\\grader\\test_hidden_fees.py:23: AssertionError\n____________________ test_discovered_float_ties[25000-3-8] ____________________\n\namount = 25000, bps = 3, want = 8\n\n    @pytest.mark.parametrize(\"amount,bps,want\", [(5000, 3, 2), (25000, 3, 8), (35000, 3, 11)])\n    def test_discovered_float_ties(amount, bps, want):\n        # Deterministic search results, see tools/rounding_cases.json.\n>       assert compute_fee(amount, Schedule([Tier(None, bps, 0)], 0, 100000)) == want\nE       assert 7 == 8\nE        +  where 7 = compute_fee(25000, Schedule(tiers=[Tier(up_to_minor=None, bps=3, fixed_minor=0)], min_fee_minor=0, max_fee_minor=100000))\nE        +    where Schedule(tiers=[Tier(up_to_minor=None, bps=3, fixed_minor=0)], min_fee_minor=0, max_fee_minor=100000) = Schedule([Tier(up_to_minor=None, bps=3, fixed_minor=0)], 0, 100000)\n\n..\\grader\\test_hidden_fees.py:23: AssertionError\n___________________ test_discovered_float_ties[35000-3-11] ____________________\n\namount = 35000, bps = 3, want = 11\n\n    @pytest.mark.parametrize(\"amount,bps,want\", [(5000, 3, 2), (25000, 3, 8), (35000, 3, 11)])\n    def test_discovered_float_ties(amount, bps, want):\n        # Deterministic search results, see tools/rounding_cases.json.\n>       assert compute_fee(amount, Schedule([Tier(None, bps, 0)], 0, 100000)) == want\nE       assert 10 == 11\nE        +  where 10 = compute_fee(35000, Schedule(tiers=[Tier(up_to_minor=None, bps=3, fixed_minor=0)], min_fee_minor=0, max_fee_minor=100000))\nE        +    where Schedule(tiers=[Tier(up_to_minor=None, bps=3, fixed_minor=0)], min_fee_minor=0, max_fee_minor=100000) = Schedule([Tier(up_to_minor=None, bps=3, fixed_minor=0)], 0, 100000)\n\n..\\grader\\test_hidden_fees.py:23: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_2jl9wv70\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fees.py::test_discovered_float_ties[5000-3-2] - ...\nFAILED ..\\grader\\test_hidden_fees.py::test_discovered_float_ties[25000-3-8]\nFAILED ..\\grader\\test_hidden_fees.py::test_discovered_float_ties[35000-3-11]\n3 failed, 16 passed in 0.59s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "wrong_marginal",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok_wrong_reason",
      "tests": {
        "total": 3,
        "passed": 1,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_tier_midpoints",
        "test_hidden::test_ticket_worked_example_with_clamps"
      ],
      "must_fail_hit": [],
      "duration_s": 0.939,
      "stderr_tail": "FF.                                                                      [100%]\n================================== FAILURES ===================================\n_____________________________ test_tier_midpoints _____________________________\n\n    def test_tier_midpoints():\n        schedule = Schedule([Tier(10000, 100, 10), Tier(20000, 50, 20), Tier(None, 25, 30)], 0, 999999)\n        for amount, expected in [(5000, 60), (15000, 95), (30000, 105)]:\n>           assert compute_fee(amount, schedule) == expected\nE           assert 145 == 95\nE            +  where 145 = compute_fee(15000, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=20000, bps=50, fixed_minor=20), Tier(up_to_minor=None, bps=25, fixed_minor=30)], min_fee_minor=0, max_fee_minor=999999))\n\n..\\grader\\test_hidden.py:8: AssertionError\n___________________ test_ticket_worked_example_with_clamps ____________________\n\n    def test_ticket_worked_example_with_clamps():\n        schedule = Schedule([Tier(10000, 100, 10), Tier(20000, 50, 20), Tier(None, 25, 30)], 25, 100)\n        for amount, expected in [(5000, 60), (15000, 95), (100, 25), (30000, 100)]:\n>           assert compute_fee(amount, schedule) == expected\nE           assert 100 == 95\nE            +  where 100 = compute_fee(15000, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=20000, bps=50, fixed_minor=20), Tier(up_to_minor=None, bps=25, fixed_minor=30)], min_fee_minor=25, max_fee_minor=100))\n\n..\\grader\\test_hidden.py:14: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_848k6tcm\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_tier_midpoints - assert 145 == 95\nFAILED ..\\grader\\test_hidden.py::test_ticket_worked_example_with_clamps - ass...\n2 failed, 1 passed in 0.22s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "09_tiered_fees",
      "variant": "wrong_marginal",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 19,
        "passed": 17,
        "failed": 2,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_fees::test_inclusive_boundaries",
        "test_hidden_fees::test_non_marginal"
      ],
      "must_fail_hit": [
        "test_non_marginal"
      ],
      "duration_s": 1.295,
      "stderr_tail": "F...F..............                                                      [100%]\n================================== FAILURES ===================================\n__________________________ test_inclusive_boundaries __________________________\n\n    def test_inclusive_boundaries():\n        tiers = [Tier(10000, 100, 10), Tier(20000, 50, 20), Tier(None, 25, 30)]\n        schedule = Schedule(tiers, 0, 10**20)\n        for boundary in (10000, 20000):\n            for amount in (boundary - 1, boundary, boundary + 1):\n                tier = next(t for t in tiers if t.up_to_minor is None or amount <= t.up_to_minor)\n>               assert compute_fee(amount, schedule) == expected(amount, tier)\nE               assert 120 == 70\nE                +  where 120 = compute_fee(10001, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=20000, bps=50, fixed_minor=20), Tier(up_to_minor=None, bps=25, fixed_minor=30)], min_fee_minor=0, max_fee_minor=100000000000000000000))\nE                +  and   70 = expected(10001, Tier(up_to_minor=20000, bps=50, fixed_minor=20))\n\n..\\grader\\test_hidden_fees.py:17: AssertionError\n______________________________ test_non_marginal ______________________________\n\n    def test_non_marginal():\n        schedule = Schedule([Tier(10000, 100, 10), Tier(None, 50, 20)], 0, 999999)\n>       assert compute_fee(15000, schedule) == 95\nE       assert 145 == 95\nE        +  where 145 = compute_fee(15000, Schedule(tiers=[Tier(up_to_minor=10000, bps=100, fixed_minor=10), Tier(up_to_minor=None, bps=50, fixed_minor=20)], min_fee_minor=0, max_fee_minor=999999))\n\n..\\grader\\test_hidden_fees.py:28: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run__ac0kd72\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_fees.py::test_inclusive_boundaries - assert 120 ...\nFAILED ..\\grader\\test_hidden_fees.py::test_non_marginal - assert 145 == 95\n2 failed, 17 passed in 0.55s",
      "predicted_naive": "ok_wrong_reason",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "starter",
      "kind": "starter",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 2,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden::test_count_mismatch"
      ],
      "must_fail_hit": [],
      "duration_s": 0.848,
      "stderr_tail": "..F                                                                      [100%]\n================================== FAILURES ===================================\n_____________________________ test_count_mismatch _____________________________\n\n    def test_count_mismatch():\n        lines = render([Payment(\"000000000123\", 100, \"reference\")]).splitlines()\n        lines[-1] = b\"T000002\" + lines[-1][7:]\n        result = parse(b\"\\n\".join(lines) + b\"\\n\")\n>       assert not result.accepted\nE       AssertionError: assert not True\nE        +  where True = BatchResult(accepted=True, payments=[Payment(payee_account='000000000123', amount_minor=100, reference='reference')], errors=[]).accepted\n\n..\\grader\\test_hidden.py:36: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_8wn4ryum\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden.py::test_count_mismatch - AssertionError: assert...\n1 failed, 2 passed in 0.09s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "starter",
      "kind": "starter",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 39,
        "passed": 12,
        "failed": 27,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_batch::test_crlf",
        "test_hidden_batch::test_hash_total",
        "test_hidden_batch::test_count_mismatch",
        "test_hidden_batch::test_atomic_batch_rejection",
        "test_hidden_batch::test_multiple_errors_and_line_numbers",
        "test_hidden_batch::test_invalid_records[<lambda>-invalid_encoding]",
        "test_hidden_batch::test_invalid_records[<lambda>-record_type]",
        "test_hidden_batch::test_missing_and_order",
        "test_hidden_batch::test_field_formats[0-1-13-synthetic001-invalid_header]",
        "test_hidden_batch::test_field_formats[0-1-13-SYNTHETIC00!-invalid_header]",
        "test_hidden_batch::test_field_formats[0-13-21-20260230-invalid_header]",
        "test_hidden_batch::test_field_formats[0-21-24-XYZ-invalid_header]",
        "test_hidden_batch::test_field_formats[0-24-25-X-invalid_header]",
        "test_hidden_batch::test_field_formats[1-1-13-00000000012X-invalid_detail]",
        "test_hidden_batch::test_field_formats[1-13-25-000000000000-invalid_detail]",
        "test_hidden_batch::test_field_formats[1-13-25-00000000000X-invalid_detail]",
        "test_hidden_batch::test_field_formats[1-25-45-                    -invalid_detail]",
        "test_hidden_batch::test_field_formats[1-45-46-X-invalid_detail]",
        "test_hidden_batch::test_field_formats[2-1-7-00000X-invalid_trailer]",
        "test_hidden_batch::test_field_formats[2-7-22-00000000000000X-invalid_trailer]",
        "test_hidden_batch::test_field_formats[2-22-32-000000000X-invalid_trailer]",
        "test_hidden_batch::test_field_formats[2-32-33-X-invalid_trailer]",
        "test_hidden_batch::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\rD000000000123000000000100reference                                              \\rT0000010000000000001000000000123                                                \\r-want0]",
        "test_hidden_batch::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\nD000000000123000000000100reference                                              \\nT0000010000000000001000000000123                                                \\r-want1]",
        "test_hidden_batch::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\n\\nD000000000123000000000100reference                                              \\nT0000010000000000001000000000123                                                -want2]",
        "test_hidden_batch::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\nD000000000123000000000100reference                                              -want3]",
        "test_hidden_batch::test_roundtrip_and_single_digit_corruption"
      ],
      "must_fail_hit": [],
      "duration_s": 1.245,
      "stderr_tail": "        corrupted = parse((b\"\\r\\n\" if crlf else b\"\\n\").join(rows))\n>       assert not corrupted.accepted and corrupted.payments == []\nE       AssertionError: assert (not True)\nE        +  where True = BatchResult(accepted=True, payments=[Payment(payee_account='000000000000', amount_minor=100000000001, reference='0')], errors=[]).accepted\nE       Failing test case: test_roundtrip_and_single_digit_corruption(\nE           cases=[(0, 1, '0')],\nE           crlf=False,\nE       )\n\n..\\grader\\test_hidden_batch.py:165: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_2cm8_v87\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_batch.py::test_crlf - AssertionError: assert (Fa...\nFAILED ..\\grader\\test_hidden_batch.py::test_hash_total - AssertionError: asse...\nFAILED ..\\grader\\test_hidden_batch.py::test_count_mismatch - AssertionError: ...\nFAILED ..\\grader\\test_hidden_batch.py::test_atomic_batch_rejection - Assertio...\nFAILED ..\\grader\\test_hidden_batch.py::test_multiple_errors_and_line_numbers\nFAILED ..\\grader\\test_hidden_batch.py::test_invalid_records[<lambda>-invalid_encoding]\nFAILED ..\\grader\\test_hidden_batch.py::test_invalid_records[<lambda>-record_type]\nFAILED ..\\grader\\test_hidden_batch.py::test_missing_and_order - AssertionErro...\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[0-1-13-synthetic001-invalid_header]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[0-1-13-SYNTHETIC00!-invalid_header]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[0-13-21-20260230-invalid_header]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[0-21-24-XYZ-invalid_header]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[0-24-25-X-invalid_header]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-1-13-00000000012X-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-13-25-000000000000-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-13-25-00000000000X-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-25-45-                    -invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-45-46-X-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[2-1-7-00000X-invalid_trailer]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[2-7-22-00000000000000X-invalid_trailer]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[2-22-32-000000000X-invalid_trailer]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[2-32-33-X-invalid_trailer]\nFAILED ..\\grader\\test_hidden_batch.py::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\rD000000000123000000000100reference                                              \\rT0000010000000000001000000000123                                                \\r-want0]\nFAILED ..\\grader\\test_hidden_batch.py::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\nD000000000123000000000100reference                                              \\nT0000010000000000001000000000123                                                \\r-want1]\nFAILED ..\\grader\\test_hidden_batch.py::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\n\\nD000000000123000000000100reference                                              \\nT0000010000000000001000000000123                                                -want2]\nFAILED ..\\grader\\test_hidden_batch.py::test_terminator_blank_and_missing_trailer_errors[HSYNTHETIC00120260101CAD                                                        \\nD000000000123000000000100reference                                              -want3]\nFAILED ..\\grader\\test_hidden_batch.py::test_roundtrip_and_single_digit_corruption\n27 failed, 12 passed in 0.53s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "reference",
      "kind": "reference",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.794,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_nr209da3\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "reference",
      "kind": "reference",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 39,
        "passed": 39,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.66,
      "stderr_tail": ".......................................                                  [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_d530fl7p\\junit.xml -\n39 passed in 0.86s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "naive",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.759,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_s4z5mdpc\\junit.xml -\n3 passed in 0.02s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "alt_valid",
      "kind": "alt_valid",
      "grader": "final",
      "repeat": 0,
      "expected": "PASS",
      "outcome": "PASS",
      "verdict": "ok",
      "tests": {
        "total": 39,
        "passed": 39,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 1.581,
      "stderr_tail": ".......................................                                  [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_3wr1h1dg\\junit.xml -\n39 passed in 0.85s",
      "predicted_naive": "",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "wrong_partial_accept",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.762,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_ssxjju5s\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "wrong_partial_accept",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 39,
        "passed": 38,
        "failed": 1,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_batch::test_atomic_batch_rejection"
      ],
      "must_fail_hit": [
        "test_atomic_batch_rejection"
      ],
      "duration_s": 1.71,
      "stderr_tail": "...F...................................                                  [100%]\n================================== FAILURES ===================================\n_________________________ test_atomic_batch_rejection _________________________\n\n    def test_atomic_batch_rejection():\n        payments = fixture() + [Payment(\"000000000456\", 200, \"second\")]\n        rows = render(payments).splitlines()\n        rows[2] = rows[2][:1] + b\"X\" + rows[2][2:]\n        result = parse(b\"\\n\".join(rows))\n>       assert not result.accepted and result.payments == []\nE       AssertionError: assert (not True)\nE        +  where True = BatchResult(accepted=True, payments=[Payment(payee_account='000000000123', amount_minor=100, reference='reference')], ...lid_detail'), BatchError(line_no=4, code='control_total_mismatch'), BatchError(line_no=4, code='hash_total_mismatch')]).accepted\n\n..\\grader\\test_hidden_batch.py:53: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_dytqcx6a\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_batch.py::test_atomic_batch_rejection - Assertio...\n1 failed, 38 passed in 0.97s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "wrong_ignores_hash_total",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.775,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run__ysrnk2v\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "wrong_ignores_hash_total",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 39,
        "passed": 31,
        "failed": 8,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_batch::test_hash_total",
        "test_hidden_batch::test_atomic_batch_rejection",
        "test_hidden_batch::test_multiple_errors_and_line_numbers",
        "test_hidden_batch::test_field_formats[1-1-13-00000000012X-invalid_detail]",
        "test_hidden_batch::test_field_formats[1-13-25-000000000000-invalid_detail]",
        "test_hidden_batch::test_field_formats[1-13-25-00000000000X-invalid_detail]",
        "test_hidden_batch::test_field_formats[1-25-45-                    -invalid_detail]",
        "test_hidden_batch::test_field_formats[1-45-46-X-invalid_detail]"
      ],
      "must_fail_hit": [
        "test_hash_total"
      ],
      "duration_s": 1.754,
      "stderr_tail": "        (0, 1, 13, b\"SYNTHETIC00!\", \"invalid_header\"),\n        (0, 13, 21, b\"20260230\", \"invalid_header\"),\n        (0, 21, 24, b\"XYZ\", \"invalid_header\"),\n        (0, 24, 25, b\"X\", \"invalid_header\"),\n        (1, 1, 13, b\"00000000012X\", \"invalid_detail\"),\n        (1, 13, 25, b\"000000000000\", \"invalid_detail\"),\n        (1, 13, 25, b\"00000000000X\", \"invalid_detail\"),\n        (1, 25, 45, b\" \" * 20, \"invalid_detail\"),\n        (1, 45, 46, b\"X\", \"invalid_detail\"),\n        (2, 1, 7, b\"00000X\", \"invalid_trailer\"),\n        (2, 7, 22, b\"00000000000000X\", \"invalid_trailer\"),\n        (2, 22, 32, b\"000000000X\", \"invalid_trailer\"),\n        (2, 32, 33, b\"X\", \"invalid_trailer\"),\n    ])\n    def test_field_formats(row, start, end, value, code):\n        rows = render(fixture()).splitlines()\n        rows[row] = rows[row][:start] + value + rows[row][end:]\n        result = parse(b\"\\n\".join(rows))\n        expected = [(row + 1, code)]\n        if row == 1:\n            expected += [(3, \"control_total_mismatch\"), (3, \"hash_total_mismatch\")]\n        assert not result.accepted and result.payments == []\n>       assert errors(result) == expected\nE       AssertionError: assert [(2, 'invalid...al_mismatch')] == [(2, 'invalid...al_mismatch')]\nE         \nE         Right contains one more item: (3, 'hash_total_mismatch')\nE         Use -v to get more diff\n\n..\\grader\\test_hidden_batch.py:112: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_j0wdm76o\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_batch.py::test_hash_total - AssertionError: asse...\nFAILED ..\\grader\\test_hidden_batch.py::test_atomic_batch_rejection - Assertio...\nFAILED ..\\grader\\test_hidden_batch.py::test_multiple_errors_and_line_numbers\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-1-13-00000000012X-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-13-25-000000000000-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-13-25-00000000000X-invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-25-45-                    -invalid_detail]\nFAILED ..\\grader\\test_hidden_batch.py::test_field_formats[1-45-46-X-invalid_detail]\n8 failed, 31 passed in 0.99s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "wrong_crlf_slicing",
      "kind": "wrong",
      "grader": "naive",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "PASS",
      "verdict": "false_pass",
      "tests": {
        "total": 3,
        "passed": 3,
        "failed": 0,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [],
      "must_fail_hit": [],
      "duration_s": 0.773,
      "stderr_tail": "...                                                                      [100%]\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_k_p08a41\\junit.xml -\n3 passed in 0.03s",
      "predicted_naive": "false_pass",
      "extra": {}
    },
    {
      "task": "10_batch_parser",
      "variant": "wrong_crlf_slicing",
      "kind": "wrong",
      "grader": "final",
      "repeat": 0,
      "expected": "FAIL",
      "outcome": "FAIL",
      "verdict": "ok",
      "tests": {
        "total": 39,
        "passed": 34,
        "failed": 5,
        "errors": 0,
        "skipped": 0
      },
      "failed_tests": [
        "test_hidden_batch::test_crlf",
        "test_hidden_batch::test_mixed_terminators_and_optional_final[]",
        "test_hidden_batch::test_mixed_terminators_and_optional_final[\\n]",
        "test_hidden_batch::test_mixed_terminators_and_optional_final[\\r\\n]",
        "test_hidden_batch::test_roundtrip_and_single_digit_corruption"
      ],
      "must_fail_hit": [
        "test_crlf"
      ],
      "duration_s": 1.366,
      "stderr_tail": "..\\grader\\test_hidden_batch.py:128: AssertionError\n_________________ test_roundtrip_and_single_digit_corruption __________________\n\n    @given(cases=st.lists(st.tuples(st.integers(0, 999999999999), st.integers(1, 10**8),\n>                                 st.text(alphabet=\"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\", min_size=1, max_size=20)),\n                   ^^^\n                         min_size=1, max_size=20), crlf=st.booleans())\n\n..\\grader\\test_hidden_batch.py:153: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\ncases = [(3751, 17226536, '7N843RF6XHCYXYHRY'), (7987945, 13174, '67WXNNB'), (7011370, 5552861, 'L')]\ncrlf = True\n\n    @given(cases=st.lists(st.tuples(st.integers(0, 999999999999), st.integers(1, 10**8),\n                                  st.text(alphabet=\"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\", min_size=1, max_size=20)),\n                         min_size=1, max_size=20), crlf=st.booleans())\n    def test_roundtrip_and_single_digit_corruption(cases, crlf):\n        payments = [Payment(f\"{account:012d}\", amount, ref) for account, amount, ref in cases]\n        data = render(payments, crlf)\n        result = parse(data)\n>       assert result.accepted and result.payments == payments and result.errors == []\nE       AssertionError: assert (False)\nE        +  where False = BatchResult(accepted=False, payments=[], errors=[BatchError(line_no=1, code='invalid_encoding'), BatchError(line_no=2,...e='invalid_encoding'), BatchError(line_no=4, code='invalid_encoding'), BatchError(line_no=5, code='invalid_encoding')]).accepted\nE       Failing test case: test_roundtrip_and_single_digit_corruption(\nE           cases=[(3751, 17226536, '7N843RF6XHCYXYHRY'),\nE            (7987945, 13174, '67WXNNB'),\nE            (7011370, 5552861, 'L')],\nE           crlf=True,\nE       )\n\n..\\grader\\test_hidden_batch.py:159: AssertionError\n- generated xml file: C:\\Users\\User\\AppData\\Local\\Temp\\bcp\\run_0dlp9wnm\\junit.xml -\n=========================== short test summary info ===========================\nFAILED ..\\grader\\test_hidden_batch.py::test_crlf - AssertionError: assert (Fa...\nFAILED ..\\grader\\test_hidden_batch.py::test_mixed_terminators_and_optional_final[]\nFAILED ..\\grader\\test_hidden_batch.py::test_mixed_terminators_and_optional_final[\\n]\nFAILED ..\\grader\\test_hidden_batch.py::test_mixed_terminators_and_optional_final[\\r\\n]\nFAILED ..\\grader\\test_hidden_batch.py::test_roundtrip_and_single_digit_corruption\n5 failed, 34 passed in 0.59s",
      "predicted_naive": "false_pass",
      "extra": {}
    }
  ],
  "flips": [],
  "wall_s": 79.574,
  "task_digests": {
    "01_idempotent_payments": "bc570e1115344c64cd6a1de0ce4616fa22e84ab4cf61bc0e48afa46c3ddc78c2",
    "02_interest_accrual": "f06ba6a249e0c2ce0b0ae5df440d80cde5d0007f3d786e1f0a90823443968e4d",
    "03_fx_quotes": "1ae2cbb37f3fc13f523bf888bb502f58d4ec8dd4c4204c95b7fe16955874cb92",
    "04_ledger_reconciliation": "e316660e7769579eb2a07f050f8720e95d72b4b01441498f5fc9c7f0eb89db1f",
    "05_double_entry": "f1256163484760b46683fbed0e800d8c85f6cc75a0c396b165e6ce8fa8e29d49",
    "06_available_balance": "210302c6ed9d02a0f2f7138282a5d90873af89a209a706a2b4c0fb44d826ea1a",
    "07_statement_periods": "425c4b96041c0bf8beb3d1242ab87bcc5704a022ec91f7f7afc0c80816827afc",
    "08_refund_limits": "3f9dacc9ccf574c7c063f176366b963e740b2d534900dae1f6e9cc6687c5fe1e",
    "09_tiered_fees": "dceeb23108a82f1303728e3003d064d8f0ab3f8ac4c7ab18024ce98c74e9898a",
    "10_batch_parser": "a93ace5a0129abe58e8112333ac3405ae9d9253a5a31ffbf237f64f0cc3c93e1"
  },
  "source_changed_during_run": false,
  "invocation": {
    "tasks": null,
    "variants": null,
    "grader": "all",
    "repeat": 1,
    "jobs": 4
  }
}
