11-Apr-2026 — Remove path collision in public walks listing projection #229
build 584 — commit fd029e1
walks: remove path collision in public walks listing projection (#229, #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