openspec: archive profile-stats + profile-weekly-distance, sync specs

Both changes are implemented and merged (#539, #541). Promote their deltas into
openspec/specs/, move the changes to changes/archive/2026-06-14-*, and add the
two capabilities to the CAPABILITIES index.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-06-14 16:34:06 +02:00
parent 7e76bbd447
commit 2ad9898f9c
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9
13 changed files with 80 additions and 0 deletions

View file

@ -0,0 +1,41 @@
# profile-stats Specification
## Purpose
TBD - created by archiving change profile-stats. Update Purpose after archive.
## Requirements
### Requirement: Lifetime totals on the profile
The profile page SHALL show a stats header with the owner's lifetime totals: activity count, total distance, total ascent, and total elapsed time.
#### Scenario: Totals shown for an athlete with activities
- **WHEN** a user views a profile whose owner has activities
- **THEN** a stats header shows the activity count, total distance, total ascent, and total elapsed time
#### Scenario: Header hidden when there are none
- **WHEN** the profile owner has no activities the viewer may see
- **THEN** no stats header is shown
### Requirement: Viewer-scoped roll-ups
The roll-up SHALL count only the activities the viewer is permitted to see: public-only for other viewers, and all of the owner's activities when the owner views their own profile.
#### Scenario: Visitor sees public-only totals
- **WHEN** a visitor (not the owner) views a profile
- **THEN** the totals aggregate only the owner's public activities (unlisted and private are excluded)
#### Scenario: Owner sees their full totals
- **WHEN** the owner views their own profile
- **THEN** the totals aggregate all of the owner's activities regardless of visibility
### Requirement: Recent-activity summary
The stats header SHALL show the count of activities in the last 4 weeks (rolling), under the same viewer scoping as the totals.
#### Scenario: Last-4-weeks count
- **WHEN** the stats header is shown
- **THEN** it includes the number of the owner's (viewer-scoped) activities started in the last 28 days
### Requirement: Localized stat labels
The stats header SHALL render its labels and units through localized strings.
#### Scenario: German labels
- **WHEN** the UI locale is German
- **THEN** the stat labels render in German

View file

@ -0,0 +1,37 @@
# profile-weekly-distance Specification
## Purpose
TBD - created by archiving change profile-weekly-distance. Update Purpose after archive.
## Requirements
### Requirement: Weekly distance chart on the profile
The profile page SHALL show a weekly-distance bar chart beneath the stats header, with one bar per week for the last 12 weeks and bar heights normalized to the busiest week in the window.
#### Scenario: Chart shown when there is recent distance
- **WHEN** a user views a profile whose owner has distance in the last 12 weeks
- **THEN** a 12-week bar chart is shown, the tallest bar being the week with the most distance
#### Scenario: Chart hidden without recent distance
- **WHEN** the owner has no (viewer-visible) distance in the last 12 weeks
- **THEN** no weekly chart is shown
### Requirement: Contiguous weekly axis
The chart SHALL render a contiguous run of weeks, including weeks with no activity as zero-height bars, so the axis is stable.
#### Scenario: Empty weeks appear as gaps
- **WHEN** the owner was active in some weeks of the window but not others
- **THEN** the inactive weeks render as zero-height bars in their correct position (not omitted)
### Requirement: Viewer-scoped weekly distance
The weekly distance SHALL be scoped to what the viewer may see: public-only for other viewers, and all of the owner's activities when the owner views their own profile.
#### Scenario: Visitor sees public-only weeks
- **WHEN** a visitor (not the owner) views a profile
- **THEN** each week's bar reflects only the owner's public activities
### Requirement: Localized chart labels
The chart SHALL render its label and per-bar distance readouts through localized strings.
#### Scenario: German labels
- **WHEN** the UI locale is German
- **THEN** the chart label and distance readouts render in German