Add docs/inspirations.md as the durable record of the 2026-07-05/06 prior-art research — per-project learnings with source paths, canonical credit lines, and the changes each spawned — and extend the acknowledgment lists in philosophy.md/architecture.md (Organic Maps, Endurain, wanderer). New OpenSpec changes (proposal/design/specs/tasks each): - Organic Maps: elevation-profile-hardening, gpx-parser-robustness, hiking-time-estimate, poi-index, hiking-foot-profile - Endurain: account-export, activity-duplicate-review, fit-parsing-hardening, activity-locations, self-hosting-guide, activity-privacy-controls - wanderer: federation-hardening, link-share-tokens - credits-page (user-visible acknowledgments) Updated in-flight changes with wanderer prior-art sections: route-federation, route-discovery. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.6 KiB
ADDED Requirements
Requirement: Full-account export archive
The Journal SHALL let a user export all data they own as a single ZIP archive: every route (current GPX plus version-history GPX files), every activity (GPX when present), activity media, and JSON manifests for profile, route/activity metadata, follows, notification history, and connected-service names. The archive SHALL carry a manifest.json with a format version. OAuth tokens, credentials, sessions, and other users' content SHALL NOT be included.
Scenario: Archive contains originals in open formats
- WHEN a user with routes and activities requests an export
- THEN the archive contains one GPX file per route and per activity with GPX, and JSON manifests keyed by the same ids
Scenario: Secrets never exported
- WHEN a user with a connected Wahoo account exports
- THEN the archive lists the connection's provider and date only, with no tokens or credentials
Requirement: Asynchronous generation with bounded memory
Export generation SHALL run as a background job that streams data in batches (memory use independent of account size), notify the user when the archive is ready, and allow only one active export job per user.
Scenario: Export of a large account completes
- WHEN a user with thousands of activities requests an export
- THEN the job completes without exhausting memory and a "export ready" notification links to the download
Scenario: Duplicate request returns the running job
- WHEN a user requests an export while one is already generating
- THEN no second job starts and the settings page shows the in-progress state
Requirement: Owner-only, expiring download
The export artifact SHALL be downloadable only by the authenticated owner through an app route, and SHALL expire (deleted from storage) after 7 days.
Scenario: Another user cannot download
- WHEN a different authenticated user requests the export download URL
- THEN the request is rejected
Scenario: Expired artifact is gone
- WHEN 7 days pass after generation
- THEN the artifact is removed from storage and the settings page offers a fresh export
Requirement: Documented archive format
The archive layout and manifest schema SHALL be documented in the repository (docs/export-format.md) and versioned via manifest.formatVersion, so a future import capability can consume archives across versions.
Scenario: Format documented
- WHEN the export capability ships
- THEN
docs/export-format.mddescribes every file and manifest field for format version 1