fix(training): neutralize volume trends

Merged
AS
3mo ago
+232-49

Summary

  • replace the unsupported isProgressing judgment with server-owned descriptive volume direction
  • render increasing, decreasing, and stable exercise-volume trends with explicit neutral text and one neutral chart color
  • rename the Strength section to describe exercise volume rather than imply that more load is inherently desirable

Validation

  • pnpm vitest run --project unit packages/server/src/repositories/strength-repository.test.ts packages/server/src/routers/strength-stress.test.ts packages/web/src/components/ProgressiveOverloadCards.test.tsx (59 passed)
  • pnpm --dir packages/server exec tsc --noEmit
  • pnpm --dir packages/web exec tsc --noEmit
  • pnpm exec tsc --noEmit
  • pnpm --dir packages/web exec storybook build
  • targeted Biome and cspell checks

Platform parity

Mobile has no progressive-overload query or rendering surface, so there is no native production behavior to change. The descriptive contract remains available to any future consumer.

Local environment evidence

The broad pnpm test run passed the changed tests and produced no assertion failure before an unrelated Compose wrapper test stalled for 3:05 in docker compose ... port db 5432. The runner was stopped with exit 130 without retry or workaround; the unresolved local daemon evidence is recorded in docs/production-incident-baseline.md. Exact-head CI is authoritative for the full suite and DB shards.

Fixes #2113

Summary by Sourcery

Neutralize strength progressive-overload volume trends by replacing the boolean progression judgment with a descriptive server-owned trend and updating the web UI to present volume direction neutrally.

New Features:

  • Expose an explicit trend field (increasing, decreasing, stable) in the progressive overload server response for each exercise.
  • Display exercise weekly volume direction in the Strength training tab using neutral text labels and a single chart color instead of positive/negative indicators.

Enhancements:

  • Rename the Strength progressive overload section and empty-state copy to describe exercise volume trends rather than imply desirability of load changes.
  • Add a TDD plan document outlining the neutral strength volume trends change and its validation strategy.

Documentation:

  • Document the neutral strength volume trend behavior and scope in a new superpowers plan file.
  • Record a local Docker daemon Compose-port stall as unresolved evidence in the production incident baseline, clarifying CI as the authoritative validation gate.

Tests:

  • Expand server unit, router, and stress tests to assert the new descriptive trend contract and serialization.
  • Add web component tests for ProgressiveOverloadCards to verify neutral styling, explicit trend text, and consistent chart coloring.
  • Update Storybook fixtures to match the new progressive overload trend contract.

Chores:

  • Adjust type definitions and interfaces across server and web to remove the isProgressing flag in favor of the new trend type.

Summary by cubic

Replaces the boolean progression judgment with a server-owned trend and updates the Strength UI to neutral text and a single blue chart color, with slopes formatted in the user’s units. Fixes #2113.

  • Refactors

    • Server: ProgressiveOverload now exposes trend (increasing | decreasing | stable) and removes isProgressing; strength.progressiveOverload returns trend and exports ProgressiveOverloadTrend.
    • Web: ProgressiveOverloadCards shows “Increasing/Decreasing/Stable X kg/lb/week” with an absolute slope in the selected units, one neutral sparkline color, and no arrows; section retitled to “Exercise Volume Trends” with neutral empty-state copy.
    • Tests and Storybook updated; router and stress tests expect trend; new component test verifies neutral styling and unit formatting.
  • Migration

    • Replace uses of isProgressing with trend.
    • Show the absolute slopeKgPerWeek with a direction label, formatted in the selected weight units; do not infer desirability from color or icons.