The subtree search returned early whenever it found *any* group member, so an in-tree stage that was busy or sleeping on a timer masked a reparented member genuinely parked on the tty. Checking every member instead would have meant a /proc scan per session per tick whenever nothing was parked — the common case. ProcGroups snapshots /proc once per activity pass and indexes by process group, so the cost is one walk however many sessions the daemon owns, and the subtree walk disappears: the index is a superset of it. Also fixes the background-helper test, which had stopped discriminating. It polled until awaiting_input was true and caught a moment before the helper spawned, so it passed against a deepest-descendant walk too. It now waits for the helper to exist first. Both regression tests were re-checked by patching each old implementation back in. Reported in review on #51. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>