Skip to content

% 기준 1RM 폴백 — 실측만 보던 기준에서 추정 e1RM 폴백·저장 게이트·보드 % 보존까지 (2026-08-26)

  • 기간: 2026-08-26 (1세션 — v78 배선 트랙(#831) 직후, 오너 질의 "수행 기록은 있는데 1rm은 없는 종목은 % 입력시 어떻게 처리하면 좋을까"에 대한 결정 집행, 같은 날 D1→D2→D3 연쇄)
  • 랜딩: PR #838(1a32b7e8 — 폴백·D1 탭 게이트) · PR #840(e7729d04 — D2 저장 시점 게이트로 개정) · PR #842(a478021d — D3 서버, 마이그레이션 20260826110000 Production push+프로브) · PR #843(47011936 — D3 클라 왕복·보드 % 표시) — Vercel Production success 실측
  • 설계서: 이슈 #837 본문(D1) + 코멘트(D2·D3)
  • 정본: lgPlanEditorOneRmLookup(기준 해석 우선순위) · buildPrScreenData exercises 투영(estimated1RM) · WorkoutRecord ea-save 저장 게이트 · group_validated_board_exercises_v1(20260826110000 — load_pct·pct_base) · groupStore %-왕복
  • 게이트: pctBaseOneRmFallback.test.mjs(6) · groupBoardLoadPctRoundtrip.test.mjs(4) · pgTAP group_board_load_pct.test.sql(9)
  • 버그리포트: 없음(기능 결정 집행)
  • 계약: group-props.md §4(보드 % 표시)·§5(onSave loadPct·pctBase 동반)

1. 배경

v78(% 입력 개편, 이슈 #831) 직후 오너 질의. 기준 조회가 실측 1RM 계열만 봐서 수행 기록만 있는 종목은 % 기준 후보에 아예 안 떴고, 유저 전체에 실측 1RM이 없으면 % 탭 자체가 숨어 무피드백 막다른 길이었다.

2. 문제 제기

실측만 정본이라 % 입력의 문턱이 높다

데이터 층에는 추정치가 이미 있었다 — e1RM 정책 v2가 max(best_estimated_1rm, session_best_estimated_1rm)를 산출해 estimated1RMValue로 병합 항목에 싣는데, prProps.exercises 슬림 투영이 이 필드를 떨어뜨려 조회가 쓸 수 없었다.

3. 해결 방안

원칙 (오너 결정 D1 → D2 → D3, 2026-08-26)

  • D1: "① 1rm 기록이 있으면 그거를 사용 ② e1rm이 있으면 그거를 사용 (가장 높은 것) ③ 둘 다 없으면 팝업 + kg 복귀" — ③을 % 탭 클릭 시점에 걸었더니 #676 교차 기준 경로(기록 0 종목을 타 종목 1RM 기준으로 %)가 입구에서 막히는 트레이드오프가 드러남(보고 후 개정).
  • D2: "일단 % 눌러서 입력할 수 있게는 하고, 종목 저장할때 해당 종목 기록이 1rm 기록이 없으면 그때 저장 불가 메세지" — 차단을 저장 시점으로 옮겨 입력·기준 선택은 자유, 미해석 %-값의 저장만 막는다.
  • D3: "화이트보드에는 %로 표시되게 해주고, 실제 운동 진행 상황때만 kg로. %로 입력했으면 유저가 명시적으로 바꾸기 전까지는 %로 수정화면에서도 보이게" — 실기기 확인 중 보고. 원인은 보드 저장 계약이 {type, load, reps}만 남겨 %값·기준 종목이 소실되던 것.

접근

우선순위(실측→추정 최고값)는 공용 조회 함수 한 곳에 명문화(모바일·데스크톱·그룹 컴포저 자동 상속), "가장 높은 것"은 서버 산출 max를 그대로 실어 나른다. 기존 원칙 "명시 기준 1RM 소실 시 % 잠금, 조용한 대체 금지"는 불변.

4. 적용한 내용

PR #838 — 폴백 공급·조회

  • 투영: buildPrScreenData exercises 행에 estimated1RM(>0일 때만) 동반
  • 조회: lgPlanEditorOneRmLookup 실측 체인 부재 시 추정 폴백 — 기준 픽커(WfBasePick) 후보 자동 확대

PR #840 — D2 저장 시점 게이트

  • % 탭·입력 자유(탭 시점 팝업 제거), pctSel은 후보 보유 무관, 기준 픽커 % 켜짐이면 상시 렌더(빈 상태 문구가 안내) — pctSelectable·anyPctRm 폐지
  • 종목 저장(ea-save, 세트 설정/작성 완료) 시 %-값 세트(loadPct 보유) + 기준(activePctRm) 부재 → confirm 카드("해당 종목의 1RM 기록이 없어요 — 기준 종목을 선택하거나 kg로 바꿔 입력해 주세요") + 편집 상태 유지. 자유 기록(note)은 게이트 밖

PR #842·#843 — D3 보드 % 보존(서버→클라)

  • 서버(20260826110000): 검증기에 세트 load_pct?(0..1000 — % 원본)·종목 pct_base?(uuid — 기준 종목) 수용+에코, load(환산 kg)는 세션 프리필용으로 병존, note는 둘 다 불허. Production push+프로브 실측.
  • 클라: 컴포저 draft out에 loadPct·pctBase 동반 → groupStore가 load_pct/pct_base로 왕복 → 보드 표시 "N% 반복수x세트수"(런 묶음 %·kg 분리). 수정 재진입은 loadPct 생존으로 기존 unitMode 추론이 %를 복원, pct_base 보존으로 다른 기준으로 재환산되는 사고 여지 차단. 세션 프리필은 무변경(kg). — 개정(2026-09-03, 이슈 #1150): 이 "프리필 kg"는 작성자 본인이 시작하는 경우만 상정한 것이었다. 다른 회원이 시작하면 작성자의 환산 kg가 그대로 채워지는 문제가 Production에서 실측돼, 프리필은 %·기준 종목·5kg 반올림 설정을 동반하고 kg는 시작하는 사람의 1RM으로 다시 계산하도록 바뀌었다.

작업 중 드러난 것

  • PowerShell here-string 커밋 메시지에 큰따옴표가 섞이면 git -m 인자가 절단돼 커밋 없이 빈 브랜치가 푸시된다 — 다국어 메시지는 git commit -F <파일>로.
  • 탭 시점 차단(D1)은 규칙 문면상 자연스러워 보여도 교차 기준 입구를 함께 막는다 — 차단 지점 선택이 기능 하나를 좌우했다. 트레이드오프를 보고하자 오너가 같은 날 D2로 개정.
  • % 입력의 수명은 표시·왕복 계약까지가 스코프다 — 입력·저장 게이트(D2)까지 하고도 스냅샷 계약이 kg만 남기면 사용자에겐 "%가 kg로 둔갑"으로 보인다(D3 보고). 값 하나를 살리려면 직렬화·검증기·표시·재진입 네 층을 함께 봐야 한다.

5. 적용 결과

항목결과
% 기준 후보실측 1RM 보유 종목만 → +추정 e1RM 보유 종목(수행 기록 기반)
기준 전무 종목의 %탭 숨김(무피드백) → 입력·기준 선택 자유 + 저장 시점 안내 카드(편집 유지)
#676 교차 기준 경로D1로 일시 축소 → D2로 복원(기록 0 종목도 % 켜고 타 종목 기준 선택 가능)
보드 % 세트 표시환산 kg로 둔갑 → "N% 반복수x세트수"(원본 % — 세션 프리필만 kg)
보드 수정 재진입kg로 격하(loadPct·기준 소실) → % 유지 + 같은 기준(pct_base 왕복)
우선순위 정본표면별 암묵 → 조회 함수 1곳 명문화(실측→추정→미등재)
검증신설 6+4·pgTAP 9 + 회귀, CI verify green ×4·migration-smoke, Vercel Production success ×4

미검증: 오너 실기기(추정 기준 % 입력·저장 차단 카드·보드 % 표시·수정 재진입 % 유지).

6. 이번 개선으로 향상된 것

수행 기록만 있어도 %가 바로 쓸 수 있는 도구가 됐다

1RM 실측이라는 문턱 없이, 이미 쌓인 기록의 추정치로 %-기반 훈련 진입.

입력은 자유, 저장은 정직

%-값이 기준 없이 저장되는 일은 없고, 그 차단이 입력 흐름을 방해하지 않는다 — 검증은 값이 확정되는 지점(저장)에서.

구조적으로 남는 것

% 기준 해석 우선순위(실측→추정 최고값)가 공용 조회 함수 한 곳에 살고, 저장 게이트·테스트 6건이 잠근다.

남은 것

  • 오너 실기기 확인
  • 기준 픽커 행의 실측/추정 구분 배지 — 스코프 밖, 후속 판단