============================= test session starts ============================== collecting ... collected 19 items test_contract.py::test_tools_list_matches_the_published_contract PASSED [ 5%] test_contract.py::test_each_tool_returns_content_that_matches_its_output_schema[list_tasks-arguments0] PASSED [ 10%] test_contract.py::test_each_tool_returns_content_that_matches_its_output_schema[list_tasks-arguments1] PASSED [ 15%] test_contract.py::test_each_tool_returns_content_that_matches_its_output_schema[add_task-arguments2] PASSED [ 21%] test_contract.py::test_each_tool_returns_content_that_matches_its_output_schema[complete_task-arguments3] PASSED [ 26%] test_contract.py::test_bad_calls_return_tool_errors[add_task-arguments0-String should have at least 3 characters] PASSED [ 31%] test_contract.py::test_bad_calls_return_tool_errors[add_task-arguments1-Input should be 'low', 'normal' or 'high'] PASSED [ 36%] test_contract.py::test_bad_calls_return_tool_errors[complete_task-arguments2-String should match pattern] PASSED [ 42%] test_contract.py::test_bad_calls_return_tool_errors[complete_task-arguments3-No task with ID T-9. Call list_tasks] PASSED [ 47%] test_contract.py::test_bad_calls_return_tool_errors[complete_task-arguments4-Field required] PASSED [ 52%] test_transports.py::test_stdio_round_trip PASSED [ 57%] test_transports.py::test_streamable_http_round_trip PASSED [ 63%] test_transports.py::test_http_clients_share_one_server_process PASSED [ 68%] test_transports.py::test_print_to_stdout_corrupts_the_stdio_stream PASSED [ 73%] test_transports.py::test_wrong_endpoint_path_is_not_found PASSED [ 78%] test_transports.py::test_foreign_host_header_is_rejected PASSED [ 84%] test_transports.py::test_client_script_prints_the_recorded_output PASSED [ 89%] test_transports.py::test_server_is_the_typed_tools_lesson_server PASSED [ 94%] test_transports.py::test_recorded_http_exchange_matches_a_fresh_run PASSED [100%] ============================== 19 passed in 5.93s ==============================