f93d33f93f
Turn the SIGTERM→SIGKILL deadline in `_kill_pids_posix` into `_POSIX_TERM_GRACE_SECONDS` (10.0s) documented against what it has to outlast: `web_server.py::_lifespan` blocks on `stop_hosted_room_service(timeout=5.0)` + `join(1.0)` before `PTY_REGISTRY.close_all()` (≤1.5s per attached Chat PTY). The 3.0s deadline predates the hosted-room stop (added 2026-08-30) and SIGKILLed the backend mid-teardown, so its ui-tui / tui_gateway.entry children were never closed and kept the deleted state.db-wal inode open — the next `hermes` start refused with FATAL DeletedWalGenerationError (#111912). Two invariant tests against real child processes: a teardown as long as the lifespan budget finishes gracefully (red on the old 3.0s deadline); a SIGTERM-ignoring process is still SIGKILLed at the deadline. The orphan reaper's 1.5s grace is left alone on purpose — it runs on the Desktop boot path under a 10s ready-probe — and says so in the comment. Co-authored-by: Tranquil-Flow <66773372+Tranquil-Flow@users.noreply.github.com>