The current TS watch foundation stores an absent path as a zeroed Stat and leaves the prior stat unchanged after a removal. On pinned Zig 0.17, two new guarded lifecycle controls fail: a missing file emits removed on every poll, and a newly created real file with (mtime,size)=(0,0) emits no added. A recreation with exactly the old metadata can likewise be missed. RealStatFs also maps every stat error, including permission/resource failures, to absence; a transient error can become a false removal. Watcher.track, Watcher.tick, and VirtualWatchFs.add have allocation paths that need owned-key/ChangeSet cleanup on failure.
Acceptance: represent presence separately from metadata, emit exactly one event per present/missing transition and detect same-metadata recreation and zero-stat files; propagate non-absence stat errors without mutating tracked state; preserve tracked/virtual-map contents and ownership on allocation failure. Add direct lifecycle/error/OOM tests to the standard TS watch test gate on Zig 0.17 and 0.18, including optimized mode. Keep the real CLI's existing deletion handling visible; this issue does not by itself claim complete deleted-module recompilation. No polling cutoff or metadata heuristic.