Files
gravl/.planning/STATE.md
T

3.2 KiB

Project State

Project Reference

See: .planning/PROJECT.md (updated 2026-02-15)

Core value: Logging a workout should be fast, clear, and flexible — the app never fights the user during a session Current focus: Phase 3 — Design Polish & MVP

Current Position

Phase: 3 of 4 (Design Polish & MVP) — IN PROGRESS Plan: 0 of 3 in current phase Status: Phase 2 complete, Phase 3 planning started Last activity: 2026-02-26 — Project management handoff, documentation update

Progress: [████████░░] 67% (Phases 1-2 done, design phase starts)

Performance Metrics

Velocity:

  • Total plans completed: 5
  • Average duration: ~2.8 min
  • Total execution time: ~0.23 hours

By Phase:

Phase Plans Total Avg/Plan
01-input-ux 3/3 ~4 min ~1.3 min
02-flexible-sets 2/2 ~10 min ~5 min

Recent Trend:

  • Last 5 plans: 01-01 (1 min), 01-03 (2 min), 01-02 (1 min), 02-01 (8 min), 02-02 (2 min)
  • Trend: fast

Updated after each plan completion

Accumulated Context

Decisions

  • Keep existing program model; custom workouts are a fork, not a replacement
  • Frontend-only changes for Phase 1 (zero backend risk)
  • React Hook Form + Zod approved for input validation (research recommendation)
  • Do NOT modify shared program data — fork to custom_workout table for per-user changes
  • StepperInput is a pure controlled component — no internal useState, all state lives in parent
  • 44px minimum touch targets on stepper buttons for mobile usability; 16px font prevents iOS auto-zoom
  • Decimal step (2.5) uses inputMode=decimal; integer step uses inputMode=numeric
  • All App.css interactive elements have min-height: 44px; global input font-size: 16px prevents iOS auto-zoom across all form fields
  • handleInputChange already accepts plain string values — WeightInput/RepsInput onChange passes string directly, no signature changes needed
  • flex-start alignment on .set-row and .set-inputs accommodates taller stepper containers
  • setList uses array index (not set_number key) — set_number derived as idx+1 when calling onLogSet
  • Dropset weight drops: 80% then 60% of base weight, each rounded to nearest 2.5kg per app progression convention
  • Last-set guard: handleDeleteSet returns early if setList.length <= 1, delete button also disabled in DOM
  • progress-badge and all-done class reference setList.length instead of exercise.sets — badge reflects actual set count
  • No authMiddleware on DELETE /api/logs — consistent with POST /api/logs which also passes user_id in body
  • deleteLog silently ignores 404 from backend — unlogged sets deleted mid-session cause no harm
  • Composite key (user_id, program_exercise_id, date, set_number) uniquely identifies a workout set log row for deletion

Pending Todos

None yet.

Blockers/Concerns

  • Phase 3 requires new DB tables (custom_workouts, custom_workout_exercises) and a source_type column on workout_logs — backend schema migration needed before Phase 3 planning

Session Continuity

Last session: 2026-02-21 Stopped at: Completed 02-02-PLAN.md (DELETE /api/logs endpoint + deleteLog wiring through App.jsx and WorkoutPage) Resume file: None