- authentication-methods: document completeAuth mode param ("redirect"|"json");
clarify add-passkey nudge (no dismiss mechanism, disappears on passkey add)
- journal-auth: session maxAge is 30 days; terms allow-list uses /legal/ prefix
matching (broader than fixed list of paths)
- session-notes: mark awareness isolation and UndoManager isolation as not yet
implemented (shared instances in current code)
- activity-feed: add fan-out scenario for visibility change to public
- explore: note that ?perPage is not yet implemented (hardcoded page size)
- multi-day-routes: add per-day GPX track split scenario (splitByDays option);
document overnight vs isDayBreak naming gap
- osm-poi-overlays: debounce is 800ms + 2000ms min interval (not 500ms);
retry is not automatic (fires on next viewport change)
- brouter-integration: rate limit corrected to 300/hour; add segment-cache
requirement (client caches per-pair segments)
- wahoo-route-push: OAuth state shape uses camelCase (returnTo, pushAfter
object) not snake_case with push_after boolean
- komoot-import: document noop adapter / ConnectedServiceManager bypass;
note four Komoot-specific routes that bypass the generic OAuth framework
- background-jobs: exponential backoff not wired (retryLimit only); add SIGINT
- connected-services: add revoked status; name ConnectionNotActiveError
- infrastructure: add INTEGRATION_SECRET and SENTRY_DSN to env var lists;
split secret decryption scenario by workflow (cd-apps vs cd-infra)
- secret-management: correct CD decryption — cd-apps only decrypts app.env;
cd-infra decrypts both
- transactional-emails: welcome email is async (pg-boss job); magic-link email
includes 6-digit numeric code
- journal-route-detail: websites are https: links (not mailto:); opening_hours
is also displayed
- local-dev-environment: add mobile app (Expo) dev commands
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
3 KiB
Markdown
65 lines
3 KiB
Markdown
## Purpose
|
|
|
|
Multi-day route planning with overnight waypoint markers, per-day statistics, day-aware UI, and day structure preserved in GPX exports.
|
|
|
|
## Requirements
|
|
|
|
### Requirement: Overnight waypoint markers
|
|
Any waypoint SHALL be toggleable as an overnight stop, creating day boundaries in the route.
|
|
|
|
#### Scenario: Toggle overnight
|
|
- **WHEN** a user toggles the overnight flag on a waypoint
|
|
- **THEN** the waypoint's `overnight: true` flag is set in the Yjs document
|
|
- **AND** the route is visually divided into days at that point
|
|
|
|
#### Scenario: Implicit day boundaries
|
|
- **WHEN** overnight stops are set
|
|
- **THEN** the first waypoint is the implicit start of Day 1 and the last waypoint is the implicit end of the final day
|
|
|
|
### Requirement: Per-day statistics
|
|
The Planner SHALL compute and display distance, ascent, and estimated duration for each day.
|
|
|
|
#### Scenario: Day stats computed
|
|
- **WHEN** a route has overnight waypoints
|
|
- **THEN** per-day distance, total ascent, and estimated duration are derived from segment boundaries and coordinates
|
|
|
|
### Requirement: Day-aware sidebar
|
|
The sidebar SHALL group waypoints by day with collapsible sections and per-day stats.
|
|
|
|
#### Scenario: Day breakdown
|
|
- **WHEN** a route has multiple days
|
|
- **THEN** waypoints are grouped under "Day 1", "Day 2", etc. with collapsible sections
|
|
- **AND** each section header shows day distance and ascent
|
|
|
|
### Requirement: Elevation chart day dividers
|
|
The elevation chart SHALL show day boundaries as dashed vertical lines.
|
|
|
|
#### Scenario: Day dividers on chart
|
|
- **WHEN** a route has multiple days
|
|
- **THEN** dashed vertical lines with "Day N" labels appear at each overnight waypoint position
|
|
|
|
### Requirement: Map day labels
|
|
The map SHALL display day summary labels at day boundary waypoints.
|
|
|
|
#### Scenario: Day labels on map
|
|
- **WHEN** a route has multiple days
|
|
- **THEN** white pill markers at day boundaries show "Day N . X km"
|
|
|
|
### Requirement: Multi-day GPX export
|
|
Day structure SHALL be preserved in GPX exports via waypoint type elements.
|
|
|
|
#### Scenario: Export multi-day route
|
|
- **WHEN** a user exports a plan with overnight waypoints
|
|
- **THEN** overnight waypoints include a `<type>overnight</type>` element in the GPX
|
|
- **AND** reimporting the GPX restores the day structure
|
|
|
|
#### Scenario: Per-day GPX track splitting
|
|
- **WHEN** `generateGpx` is called with `splitByDays: true`
|
|
- **THEN** the GPX output contains separate `<trk>` elements for each day's segment rather than a single track
|
|
- **AND** each `<trk>` is labelled with the day number
|
|
|
|
Note: the single-track export (without `splitByDays`) is the default. The per-day split is available as an option on the GPX generator and is the recommended format for multi-day exports to head units.
|
|
|
|
### Note on overnight vs isDayBreak naming
|
|
|
|
The Yjs wire format stores the flag as `overnight: true` on the waypoint Y.Map entry. The TypeScript interface exposes it as `isDayBreak` (a comment in `waypoint-ymap.ts` documents `overnight` as the legacy wire name). Spec scenarios use `overnight` to refer to the wire-level concept; TypeScript code uses `isDayBreak`.
|