ded9606c30
The store created an $effect.root for the save-on-change sync but returned no disposer, so the effect leaked for the life of the process — contradicting the rule that $effect.root owners must expose destroy(). Capture and expose the disposer. - add destroy() to the returned store; covered by tests (flushSync proves the save effect runs before destroy and stops after) - trim the bloated header (two near-duplicate @example blocks) to one concise JSDoc — no fluff - update typographySettings test mocks to satisfy the now-required destroy() Consumers (LayoutManager, ThemeManager, typographySettings, comparisonStore) do not yet call it — threading + the createSingleton migration follow.