The exclude-refresh reaction in useManifestSource.ts (the only trigger for an exclude edit, since live-polling defaults off) mishandles Timeline mode:
if (TIMELINE_MODE.peek()) return; — it bails, so changing/clearing excludes in Timeline never re-fetches or re-packs the union city.
lastExcludeKey is updated before that guard, so the change is swallowed: the effect only re-runs on an ACTIVE_EXCLUDES change, not on Timeline exit, so leaving Timeline won't apply it either.
The backend is fine — signature_tree(..., extra_exclude_paths=excludes) feeds the exclude set into the manifest content_signature, and the timeline bundle cache is keyed by excludes too, so a genuine re-fetch with the new exclude set returns the right data.
Fix: when the exclude set changes while in Timeline, re-fetch the timeline bundle with the new excludes and re-pack (excludes change the data, so a re-pack of the cached bundle isn't enough — it must re-fetch), holding SCRUB_POS. Don't update lastExcludeKey in a way that swallows the change.
The exclude-refresh reaction in
useManifestSource.ts(the only trigger for an exclude edit, since live-polling defaults off) mishandles Timeline mode:if (TIMELINE_MODE.peek()) return;— it bails, so changing/clearing excludes in Timeline never re-fetches or re-packs the union city.lastExcludeKeyis updated before that guard, so the change is swallowed: the effect only re-runs on anACTIVE_EXCLUDESchange, not on Timeline exit, so leaving Timeline won't apply it either.The backend is fine —
signature_tree(..., extra_exclude_paths=excludes)feeds the exclude set into the manifestcontent_signature, and the timeline bundle cache is keyed by excludes too, so a genuine re-fetch with the new exclude set returns the right data.Fix: when the exclude set changes while in Timeline, re-fetch the timeline bundle with the new excludes and re-pack (excludes change the data, so a re-pack of the cached bundle isn't enough — it must re-fetch), holding SCRUB_POS. Don't update
lastExcludeKeyin a way that swallows the change.