Self-scheduling timer in the sidecar (fresh setTimeout each night, so it always fires at 3am local regardless of drift) runs reindexFull() — builds into a fresh slot and swaps atomically only on success, never disrupting the live index. Started at boot, cleared on shutdown. Logs the next scheduled time + each run. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>