{"id":"69da3c62e6acd222dca9eaa0","title":"2026 04 11 Build 584","path":"how-to/committee/release-notes/2026-04-11-build-584","contentMarkdown":"# 11-Apr-2026 — Remove path collision in public walks listing projection [#229](https://github.com/nbarrett/ngx-ramblers/issues/229)\n\n## [build 584](https://github.com/nbarrett/ngx-ramblers/actions/runs/24282144462) — [commit fd029e1](https://github.com/nbarrett/ngx-ramblers/commit/fd029e1131a68287aa44555d4e293d387d40f659)\n\n_____\n\n### **walks**: remove path collision in public walks listing projection ([#229](https://github.com/nbarrett/ngx-ramblers/issues/229), [#222](https://github.com/nbarrett/ngx-ramblers/issues/222))\n\nThe `publicFieldsDataQueryOptions.select` used by the non-logged-in\nwalks listing projects both `groupEvent.location` and\n`groupEvent.location.description`, which MongoDB rejects with:\n\nMongoServerError: Path collision at groupEvent.location\n\nIntroduced in #222 (17bf46bc) which added `GroupEventField.LOCATION`\nto the select without removing the pre-existing `LOCATION_DESCRIPTION`.\nThe full `LOCATION` subdocument already contains `.description`, so the\nnarrower field is redundant.\n\nOnly affects the non-logged-in code path (`allPublic()`), which is why\nit slipped past post-merge testing - logged-in users hit `all()` with\na caller-supplied select that has no collision.\n\nReported by @peterjordaninfo on the Winchester Walking Weekend site.\n\n### **deploy**: retry transient Fly API failures with exponential backoff\n\nWhat changed for users\n\n- All-environments deploy runs no longer fail a whole environment\nwhen Fly's REST API drops a single call mid-request. Typical\nsymptoms this resolves: \"read: connection reset by peer\" and\ntransient 5xx responses hit during flyctl secrets import, flyctl\ndeploy, flyctl scale count, and flyctl scale memory for one\nenvironment out of fourteen\n\nTechnical\n\n- Add runCommandWithRetry helper in fly-commands.ts that wraps\nrunCommand with throwOnError=true, retries up to 3 attempts with\nexponential backoff (2s, 4s) implemented as a recursive async\nfunction to satisfy the project's no-imperative-loops rule\n- Apply runCommandWithRetry to the four network-bound flyctl calls\nin deploy-to-environments.ts: secrets import (both database and\nfile paths), deploy, scale count, and scale memory. flyctl config\nvalidate remains a direct runCommand because it is local-only\n- Make importSecretsFromFile async so it can await the retry helper","contentHtml":"<h1>11-Apr-2026 — Remove path collision in public walks listing projection <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/229\">#229</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/24282144462\">build 584</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/fd029e1131a68287aa44555d4e293d387d40f659\">commit fd029e1</a></h2>\n<hr>\n<h3><strong>walks</strong>: remove path collision in public walks listing projection (<a href=\"https://github.com/nbarrett/ngx-ramblers/issues/229\">#229</a>, <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/222\">#222</a>)</h3>\n<p>The <code>publicFieldsDataQueryOptions.select</code> used by the non-logged-in\nwalks listing projects both <code>groupEvent.location</code> and\n<code>groupEvent.location.description</code>, which MongoDB rejects with:</p>\n<p>MongoServerError: Path collision at groupEvent.location</p>\n<p>Introduced in #222 (17bf46bc) which added <code>GroupEventField.LOCATION</code>\nto the select without removing the pre-existing <code>LOCATION_DESCRIPTION</code>.\nThe full <code>LOCATION</code> subdocument already contains <code>.description</code>, so the\nnarrower field is redundant.</p>\n<p>Only affects the non-logged-in code path (<code>allPublic()</code>), which is why\nit slipped past post-merge testing - logged-in users hit <code>all()</code> with\na caller-supplied select that has no collision.</p>\n<p>Reported by @peterjordaninfo on the Winchester Walking Weekend site.</p>\n<h3><strong>deploy</strong>: retry transient Fly API failures with exponential backoff</h3>\n<p>What changed for users</p>\n<ul>\n<li>All-environments deploy runs no longer fail a whole environment\nwhen Fly&#39;s REST API drops a single call mid-request. Typical\nsymptoms this resolves: &quot;read: connection reset by peer&quot; and\ntransient 5xx responses hit during flyctl secrets import, flyctl\ndeploy, flyctl scale count, and flyctl scale memory for one\nenvironment out of fourteen</li>\n</ul>\n<p>Technical</p>\n<ul>\n<li>Add runCommandWithRetry helper in fly-commands.ts that wraps\nrunCommand with throwOnError=true, retries up to 3 attempts with\nexponential backoff (2s, 4s) implemented as a recursive async\nfunction to satisfy the project&#39;s no-imperative-loops rule</li>\n<li>Apply runCommandWithRetry to the four network-bound flyctl calls\nin deploy-to-environments.ts: secrets import (both database and\nfile paths), deploy, scale count, and scale memory. flyctl config\nvalidate remains a direct runCommand because it is local-only</li>\n<li>Make importSecretsFromFile async so it can await the retry helper</li>\n</ul>\n"}