{"id":"69da58057db299162ebc0ea3","title":"2026 04 11 Issue 214","path":"how-to/committee/release-notes/2026-04-11-issue-214","contentMarkdown":"# 11-Apr-2026 — harden migration to avoid deleting live CMS pages and dedupe footer by href [#214](https://github.com/nbarrett/ngx-ramblers/issues/214)\n\n## [build 585](https://github.com/nbarrett/ngx-ramblers/actions/runs/24284115184) — [commit fed150e](https://github.com/nbarrett/ngx-ramblers/commit/fed150e774a8c374c0c567e5ef831c5007083e00)\n\n_____\n\nThe seed-default-privacy-policy migration had two bugs that combined to\nbreak Winchester Walking Weekend's privacy policy page and leave Bolton\nwith a dead footer link:\n\n1. Unconditional `deleteOne({path: \"privacy-policy\"})` was wiping any\npage sitting at that path, including live CMS content. In practice\nthe old hardcoded component never backed its content with a\npageContent document (it loaded directly from contentText), so this\ncleanup was a no-op on every environment except ones where a real\nCMS page had been deliberately placed at the root path. Dropped the\ndeletion entirely.\n\n2. Footer dedupe was matching on the exact title \"Privacy Policy\"\n(case-insensitive), which missed existing entries titled differently\n(e.g. Winchester Walking Weekend's \"Privacy and cookie policy\"),\nleading to duplicate entries after the migration ran. Switched to an\nhref-based match that recognises any entry pointing at\n`privacy-policy` or `about-us/privacy-policy`, and shared the helper\nbetween `up()` and `down()`.\n\nThe repair for already-affected environments was applied manually:\nWinchester Walking Weekend had its `/privacy-policy` page rebuilt from\nthe surviving contentText entry, and Bolton had its dead footer entry\nremoved.","contentHtml":"<h1>11-Apr-2026 — harden migration to avoid deleting live CMS pages and dedupe footer by href <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/214\">#214</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/24284115184\">build 585</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/fed150e774a8c374c0c567e5ef831c5007083e00\">commit fed150e</a></h2>\n<hr>\n<p>The seed-default-privacy-policy migration had two bugs that combined to\nbreak Winchester Walking Weekend&#39;s privacy policy page and leave Bolton\nwith a dead footer link:</p>\n<ol>\n<li><p>Unconditional <code>deleteOne({path: &quot;privacy-policy&quot;})</code> was wiping any\npage sitting at that path, including live CMS content. In practice\nthe old hardcoded component never backed its content with a\npageContent document (it loaded directly from contentText), so this\ncleanup was a no-op on every environment except ones where a real\nCMS page had been deliberately placed at the root path. Dropped the\ndeletion entirely.</p>\n</li>\n<li><p>Footer dedupe was matching on the exact title &quot;Privacy Policy&quot;\n(case-insensitive), which missed existing entries titled differently\n(e.g. Winchester Walking Weekend&#39;s &quot;Privacy and cookie policy&quot;),\nleading to duplicate entries after the migration ran. Switched to an\nhref-based match that recognises any entry pointing at\n<code>privacy-policy</code> or <code>about-us/privacy-policy</code>, and shared the helper\nbetween <code>up()</code> and <code>down()</code>.</p>\n</li>\n</ol>\n<p>The repair for already-affected environments was applied manually:\nWinchester Walking Weekend had its <code>/privacy-policy</code> page rebuilt from\nthe surviving contentText entry, and Bolton had its dead footer entry\nremoved.</p>\n"}