Found reviewing the riskiest paths of the previous commit.
- An install dir of `/games/x` matched a process running out of `/games/xyz`.
The image-path check was already component-wise and fine; the command-line
check compared raw bytes, so it needed the separator. Two library folders
where one name prefixes the other is not a contrived case.
- Ending a nested game force-releases kept displays, which is not per-display —
so with another client streaming it could retire a display that was never
ours. Skip it while anyone else has a live session: the failure mode becomes a
game that keeps running, which is the default everywhere else anyway.
- A lease nothing polls (no detect signals, or a platform without a matcher yet)
sat at "launching" forever in the console. Report it as running: the host did
just launch it, and with no watcher it is claiming nothing about the exit.
- A game ended after its session was already gone reported no `game.exited` at
all — its watcher had stopped with the session, so nothing was left to emit
it. That is every grace expiry and every `POST /game/end`, i.e. exactly the
ones an operator most wants to see.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>