You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of #992. Blocked on #994 — the social-stats research pass. The shape below is decided; the metrics are not, and picking them by taste is exactly what #994 exists to prevent.
A room's page shows four tiles: riders, streak, this month, medals. For a crew that rides together every week, that says almost nothing about the crew.
Decided: consistency tiles lead, the ladder sits below
TOGETHER STREAK THIS MONTH SHOWED UP
84 h 6 wk 21 sessions ●●●●○●●●●●○●
ridden as a a session up from 17 last 12 sessions
crew every week
── the ladder ──────────────────────────────────────
[this month] sessions sprints
1 Jan Lauber 4,210 kJ 12 sessions ← you
2 David Kneubühler 3,880 kJ 11 sessions
3 Mike Frei 2,140 kJ 8 sessions
4 Captain-SVXN 1,905 kJ 9 sessions
The order is the finding, not a layout preference. RESEARCH.md §13.3 puts consistency and time-in-saddle above every performance metric for this audience — "wins rider surveys by 5–8×" — so what everyone sees without scrolling is how often the crew shows up, and the ranked board is for whoever wants it.
A room-scoped ladder is explicitly permitted, and only this kind is:
Leaderboards, rankings, duels live inside a room — your crew's ladder, not the internet's. No public leaderboards.
Which metrics the tiles carry. "Hours together" and "showed up" are drawn as plausible, not chosen.
Which boards exist and how they rank. kJ favours the heavy and the long; w/kg favours the light; execution favours whoever picked the easy workout — and §13.4 already warns execution must not double as a difficulty metric. The honest answer may be several boards and no single rank.
The small-N and harm question. A four-person room where the same person is always first is a different object from a twelve-person room. Suppression thresholds, decay windows, and whether a rider can be off the board at all.
rides.room_id with rides_room_started indexed for exactly this read path (20260906201812_ride_room_indexes.sql), and RoomMonthKj / ListRoomRideWeeks already query it.
The room response already carries streakWeeks and medals (server/internal/rooms/rooms.go:206).
The privacy question is the live one: a board naming another rider's kJ is durable disclosure of a ride that is private by default. Everyone in the room watched it happen live, which is the same argument #985 had to make for presence — and the same reason it needed an ADR. Expect one here too, or a metric set that avoids the problem.
Consistency tiles above the fold; the ladder below.
Every board is room-scoped, with no cross-room or global view reachable from it.
The privacy position is written down — an ADR if a board shows another rider's ride-derived numbers, or a stated reason why the chosen metrics do not need one.
Small rooms and new rooms render something that teaches rather than an empty ranked list (ux.md empty states).
Cross-room comparison, global anything, a rider's private ride detail reachable from a board, and home (which should adopt whatever vocabulary this settles, not invent its own).
Related
#992 (epic), #994 (blocking research), #993 (the per-rider counts and their vocabulary), #985 (the presence-privacy argument), WATTROOM.md (room-scoped competition).
Part of #992. Blocked on #994 — the social-stats research pass. The shape below is decided; the metrics are not, and picking them by taste is exactly what #994 exists to prevent.
A room's page shows four tiles: riders, streak, this month, medals. For a crew that rides together every week, that says almost nothing about the crew.
Mockups: https://claude.ai/code/artifact/880fdc31-6238-4547-9d3a-b291cda3f50d — right column.
Decided: consistency tiles lead, the ladder sits below
The order is the finding, not a layout preference.
RESEARCH.md §13.3puts consistency and time-in-saddle above every performance metric for this audience — "wins rider surveys by 5–8×" — so what everyone sees without scrolling is how often the crew shows up, and the ranked board is for whoever wants it.A room-scoped ladder is explicitly permitted, and only this kind is:
What #994 has to settle before this is built
What is already available
rides.room_idwithrides_room_startedindexed for exactly this read path (20260906201812_ride_room_indexes.sql), andRoomMonthKj/ListRoomRideWeeksalready query it.streakWeeksandmedals(server/internal/rooms/rooms.go:206).xp_eventscarries the per-rider counts feat(web,server): the profile shows hours in voice, sessions, sprints and tracks — all of it already counted #993 is surfacing — the same numbers, grouped by room-mate.The privacy question is the live one: a board naming another rider's kJ is durable disclosure of a ride that is private by default. Everyone in the room watched it happen live, which is the same argument #985 had to make for presence — and the same reason it needed an ADR. Expect one here too, or a metric set that avoids the problem.
Acceptance criteria
ux.mdempty states).make cigreen.Deliberately not in scope
Cross-room comparison, global anything, a rider's private ride detail reachable from a board, and home (which should adopt whatever vocabulary this settles, not invent its own).
Related
#992 (epic), #994 (blocking research), #993 (the per-rider counts and their vocabulary), #985 (the presence-privacy argument), WATTROOM.md (room-scoped competition).