Compact() removed dead callbacks but never removed the trie nodes that became empty, so the trie grew without bound under pref-observer churn. Have the compaction path walk to each removed callback's node recording the parent chain, then drop nodes that end up with no callbacks and no children, bottom-up. Only runs on the lazy idle Compact path, so notification and registration are unaffected. Adds a PruneEmptyNodesOnChurn gtest that forces the idle sweep and checks the node count returns to baseline. Differential Revision: https://phabricator.services.mozilla.com/D307918