6c3a754be9
- Every InitializeAsync/ShutdownAsync bumps a lifecycle generation. The session, namespace map and endpoint are installed under _probeLock only while the init's generation is current, so an init the host abandoned that finishes after the next shutdown discards its session instead of resurrecting it. Every health write (lifecycle, keep-alive, publish-error, read path) is generation-stamped, so a late writer can no longer overwrite newer state. - O-2: the init catch closes and disposes the LOCAL session it opened (it closed the still-null Session property, orphaning an activated session + keep-alive timer). - O-9: ShutdownAsync spends ONE budget (4 s, inside the host's 5 s PostStop budget) on wire calls: every subscription delete concurrently, then the session close with what remains; waits are abandoned when the budget fires even if the SDK ignores the token. It used to be 5 s per subscription, serially. Refs #743 Claude-Session: https://claude.ai/code/session_01Ub9hGmYLQvn9XETzw7CMsT