11-Apr-2026 — Remove path collision in public walks listing projection #229
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