docs+openspec: prior-art research (Organic Maps, Endurain, wanderer) and 15 proposals

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>
This commit is contained in:
Ullrich Schäfer 2026-07-06 07:23:00 +02:00
parent be4f7e4ae8
commit 5dd4968626
80 changed files with 2600 additions and 2 deletions

View file

@ -0,0 +1,41 @@
## 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.md` describes every file and manifest field for format version 1