b14b66ab03
SessionReaper.lastWipSweepNanos started at Long.MIN_VALUE as a "never swept yet" sentinel. That sentinel cannot be compared by subtraction. nanoTime() is positive on this platform, so `now - Long.MIN_VALUE` wraps to a large negative number, the gate `delta < WIP_SWEEP_INTERVAL_NANOS` reads it as "swept moments ago", and the method returns before the assignment that would have fixed the field. The sweep never ran once, for the life of the process, and nothing in the log said so. Measured: System.nanoTime() = 31305820625625 (positive) now - Long.MIN_VALUE = -9223340731034150183 interval (6h in nanos) = 21600000000000 gate 'delta < interval' -> true => returns early, every iteration, forever Fix: a separate `sweptOnce` boolean holds "never yet", so the subtraction only runs once both operands come from nanoTime. The first pass always sweeps — a restart is a fine moment for it, the 24h age floor keeps it safe, and the feature becomes observable right after a redeploy instead of six hours later. The existing tests all passed because they call SessionManager.sweepWipRefs directly, which walks around the gate. The new test asserts through the reaper loop instead: it spawns a worktree session, starts the reaper, and requires a real prune call at the seam with the 24h floor intact. Removing the fix makes it fail with "it never reached the seam". 860 tests, mvn clean install, BUILD SUCCESS.