2f33833de8
Fixes the four poisoned-connection classes (#81051, #77765, #84132, #81995) with the SuspectableBackend cheap-mark/lazy-verify contract: - mark_suspect/ensure_healthy protocol (agent/deadline.py): noticing a poisoned state never does I/O; the NEXT caller pays once for a health probe that clears the suspicion or forces a reconnect. A single teardown-vs-keepalive race or auth-lock corruption can no longer park a connection permanently — park stays reserved for genuinely exhausted reconnect budgets. - keepalive failure marks the connection suspect before requesting reconnect; the next tool call probes and recycles if unhealthy. - auth-classified permanent failures on a previously-proven session get a suspect+reconnect path instead of an immediate park. - fast-fail (#81995): stdio child pids are tracked at spawn and an in-flight RPC races a child-watcher task, so a dead subprocess fails the call immediately with a retryable timeout instead of riding out the full 300s. Deliberate teardown/reconnect also fails in-flight calls now instead of leaving them attached to a dying transport. Dispatch-boundary hardening for test doubles: stubbed sessions (MagicMock/non-awaitable call_tool, absent child-watcher) fall back to the exact pre-change inline-await semantics, so only real transports gain the race guard. Salvage credit: in-flight approach from #73377 (@luijoc, wedged transport recovery) and #48069 (@arminanton, keepalive/in-flight interaction); both PRs' bases predate main's current park/reconnect architecture, so this is a fresh implementation of their contracts. Tests: tests/tools/ -k mcp = 639 passed (was 22 new failures during development; final tree zero).