"A successful hide is owned by its process ID plus launch time and bundle ID, never by PID alone." — Tinker architecture, hide invariant 2
The Number Everyone Reaches For
A process ID looks like the obvious handle for "that app I hid". It is unique among running processes, it is cheap to store, and every API accepts it. The trouble is the word running. A PID identifies a process only while that process lives. When it exits, the number goes back into the pool and a later process can receive it. Between "Tinker hid Eagle" and "Tinker restores Eagle" there may be hours, a sleep, a crash of Eagle, a relaunch. A receipt that says only "PID 4127" could, after enough time, describe some entirely unrelated process.
Why the Bundle ID Is Not Enough Either
The opposite mistake is to own the app rather than the process: "Tinker hid Eagle, so Tinker shows Eagle". But if Eagle quit while hidden and Dad relaunched it, the new Eagle is a different process whose visibility Tinker never touched. Showing it on restore would be acting on a process Tinker has no receipt for — the exact thing the design forbids. The architecture states it as a separate invariant: a quit and relaunch can never make Tinker act on a different process.
Three Facts Together
So Tinker's ApplicationIdentity stores the bundle ID, the PID and the process's launch date, plus a display name for people. The key used in the journal is built from all three. Before any effect — hiding, unhiding, even answering "is it hidden?" — the adapter looks the process up by PID and then checks that it has not terminated, that its bundle ID still matches and that its launch date is exactly the recorded one. If any check fails, the answer is "not this process any more", which is nil, not true or false.
What Counts as an App at All
The snapshot that feeds prepare is narrower than "every process". It skips Tinker's own process, keeps only apps with a regular activation policy (the ones with a Dock icon and a menu bar — not background agents or menu-bar extras), and drops anything without a bundle identifier or launch date, because without those three facts Tinker could not prove ownership later. An app it cannot identify is an app it does not touch.