renderNote wiped any ## heading not owned by the renderer (Synopsis,
Cast, Links, My Notes) on every sync, destroying user content like
## Collection graph-link sections. extractCustomSections now pulls
non-owned sections out of the existing body before rewrite, and
renderNote re-emits them verbatim, in original order, between Links
and My Notes.
- SyncDeps.listNotes now returns paths only; new readNote(path) reads
content immediately before parse/diff/write per note, closing the
window where an edit made between the initial scan and a later write
got silently overwritten. resolveMissingIds updated to match.
- WatchlistController gains a syncing flag shared by syncNow and
resolveMissingIds so overlapping invocations short-circuit instead
of racing on the same vault notes.
- main.ts registers cleanup for the 30s startup catch-up setTimeout so
it doesn't fire after unload.
- syncNow takes a quiet flag (used by the scheduled catch-up path) so
zero-change scheduled syncs don't spam a Notice; manual commands are
unaffected.