# 11-Apr-2026 — Remove path collision in public walks listing projection [#229](https://github.com/nbarrett/ngx-ramblers/issues/229)

## [build 584](https://github.com/nbarrett/ngx-ramblers/actions/runs/24282144462) — [commit fd029e1](https://github.com/nbarrett/ngx-ramblers/commit/fd029e1131a68287aa44555d4e293d387d40f659)

_____

### **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))

The `publicFieldsDataQueryOptions.select` used by the non-logged-in
walks listing projects both `groupEvent.location` and
`groupEvent.location.description`, which MongoDB rejects with:

MongoServerError: Path collision at groupEvent.location

Introduced in #222 (17bf46bc) which added `GroupEventField.LOCATION`
to the select without removing the pre-existing `LOCATION_DESCRIPTION`.
The full `LOCATION` subdocument already contains `.description`, so the
narrower field is redundant.

Only affects the non-logged-in code path (`allPublic()`), which is why
it slipped past post-merge testing - logged-in users hit `all()` with
a caller-supplied select that has no collision.

Reported by @peterjordaninfo on the Winchester Walking Weekend site.

### **deploy**: retry transient Fly API failures with exponential backoff

What changed for users

- All-environments deploy runs no longer fail a whole environment
when Fly's REST API drops a single call mid-request. Typical
symptoms this resolves: "read: connection reset by peer" and
transient 5xx responses hit during flyctl secrets import, flyctl
deploy, flyctl scale count, and flyctl scale memory for one
environment out of fourteen

Technical

- Add runCommandWithRetry helper in fly-commands.ts that wraps
runCommand with throwOnError=true, retries up to 3 attempts with
exponential backoff (2s, 4s) implemented as a recursive async
function to satisfy the project's no-imperative-loops rule
- Apply runCommandWithRetry to the four network-bound flyctl calls
in deploy-to-environments.ts: secrets import (both database and
file paths), deploy, scale count, and scale memory. flyctl config
validate remains a direct runCommand because it is local-only
- Make importSecretsFromFile async so it can await the retry helper