fix(daemon): replace PendingRoot placeholders with the trace-ingress fence
The family sequencer parked a PendingRoot placeholder at the start slot of every still-running mutating command and refused to drain past it. That duplicated what the trace-ingress fence already enforces (later entries wait for older open mutating roots of their family) and gave the daemon two sources of truth about a running command; it is also the wall a later change will need to bound. Remove the placeholder machinery, the Canceled variant, and the per-frame JSON injections that only fed it. The fence takes over fully: - the reader marks a mutating root finishing when it consumes its atexit and keeps the root's family, start time and mutating classification until the worker clears it, so the fence stays scoped to the right family while the final frame is queued; only the root's own frames classify it (a hook's child git cannot retarget or downgrade it); - socket EOF no longer clears a finishing root (the queued atexit does), and the close-marker predicate now matches the fence, so any root that was fencing work is cleared by the worker, which re-drains what it fenced; a root that closes without an atexit still gets its marker; - the worker clears a root when its final frame arrives, even when that frame fails to normalize, errors, or panics; - until a root's worktree is known it fences every family, so resolving it re-drains the others. Sequencer ordering itself is unchanged: entries stay keyed by command start time, which among finished commands is the best predictor of the order they changed refs (a command finishes only after its ref write, including through post-write hooks). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
S
Sasha Varlamov committed
88f6f2f6ffc19eafba11e1eca5334f13de5e236c
Parent: 44cc85b