2026-08-10 PulseUp 작업일지입니다. 오늘은 9건의 작업을 진행했습니다.

1Monitor COMBO Rest/Water Break 중앙 안내 문구

현상/기능

  • Water Break를 AMRAP처럼 표시 → Rest일 때도 표시

작업

  • `renderer/single/combo/`, , , `main/single/`, Stress/Loop main-round
  • 물보충: 다음 콤보 영상 전환 + 파란색 `WATER BREAK`. 휴식: 직전 콤보 KEEP_VIDEO + 초록색 `REST`(타이머 Rest 색 `#4CAF50`). 문구 색·글로우를 구간별로 적용. 테스트 갱신

1Monitor COMBO 다음 콤보 preload (A→B·B→C·C→D)

현상/기능

  • A→B, B→C, C→D 넘어갈 때 영상 로딩 시간이 발생하니 1Monitor AMRAP처럼 preload를 별도 소스파일로 추가

작업

  • `main/single/`(신규), , , `renderer/single/combo/`(신규), (reexport)
  • AMRAP와 동일 패턴 — main이 `nextComboGroup`을 payload에 실어 보내고, renderer 슬롯 DOM 안에 숨김 player(`opacity:0`)로 미리 로드한 뒤 전환 시 DOM 이동 없이 승격. Stress는 다음 MOVE 콤보, Loop는 같은 RND 다음 MOVE(없으면 다음 RND 첫 콤보). 헬퍼·preload 풀 테스트 및 main-round preload 검증 추가

1Monitor COMBO DS 종료 후 A1 전체화면 깜빡임 수정

현상/기능

  • COMBO Loop에서 DS 끝나고 5초 휴식이 끝날 때 A1 화면 하나가 전체화면으로 잠깐 나왔다가 영상 3개가 정상으로 나온다

작업

  • AMRAP과 동일 원인 — Main 구간 전환 프리뷰가 첫 운동 1개(solo)만 띄워 카운트다운 오버레이가 사라질 때 A1이 노출됐다. `resolveComboPreviewGroup`으로 Main 프리뷰는 첫 콤보 3개(A1·A2·A3)를 3분할로 미리 로드하고, DS/CD 프리뷰만 solo를 유지. Stress/Loop는 컨트롤러를 공유하므로 둘 다 적용. 테스트 4건 추가
  • **Electron(renderer)** · `single/combo/`(신규), , (신규)

Singleexercises AMRAP 운동설계 패널 라벨 Set → RND

현상/기능

  • Singleexercises 운동설정영역에서 AMRAP 선택 시 Set이 아닌 RND로 변경

작업

  • AMRAP일 때 컬럼 라벨이 이전 `circuitType`(stress)을 보고 `Set`으로 남던 버그 수정. 공유 헬퍼에 `isAmrapOnly`를 컬럼·카드 모두 반영해 AMRAP은 `RND`로 통일(§14·Electron 헤더와 동일). 시그니처 변경에 맞춰 Totalexercises 호출부도 동일 적용
  • **Web** · `exercises/shared/`, `Singleexercises/components/`, `Totalexercises/components/`

1Monitor AMRAP 물보충 — 다음 RND 영상 전환 + WATER BREAK 문구

현상/기능

  • water break 에는 C 영상으로 바꾸고 START 와 같은 글씨가 파란색으로 띄워져 있게

작업

  • 물보충 구간이 `KEEP_VIDEO`로 직전 RND(B) 영상을 유지하던 것을 **다음 RND(C1/C2/C3)로 전환**하도록 변경. SINGLE 공용 규칙(`renderer/single/` — water는 다음 영상을 메인에 켠다)과 일치시킴. 이미 slot preload가 끝난 묶음이라 전환에 재로딩이 없고, preload 대상은 그 다음 RND(D)로 넘긴다. 다음 RND가 없으면 현재 영상 유지. 휴식(rest)은 기존대로 `KEEP_VIDEO`. `getNextAmrapRound` 헬퍼 추출, 테스트 3건으로 교체·추가
  • 카운트다운 모달의 `START` 문구(중앙 대형·볼드·글로우)와 같은 형태로 물보충 중 `WATER BREAK`를 파란색 `#00BFFF`(기존 타이머 Water Break 색)로 표시. 두 단어라 `font-size:400px` 대신 화면에 맞는 clamp 값 사용. 문구 DOM은 영상 영역(`#amrap-body`) 안에 두어 헤더를 덮지 않게 하고, 레이아웃 전환으로 body를 다시 그릴 때 현재 문구를 재적용. 단위 테스트 3건 추가
  • **Electron(main)** · `single/amrap/`
  • **Electron(renderer)** · `single/amrap/`(신규), , , (신규)

1Monitor AMRAP DS 종료 후 A1 전체화면 깜빡임 수정

현상/기능

  • DS 끝나고 5초 휴식 끝날 때 A1 화면 하나가 전체 화면으로 잠깐 나왔다가 영상 3개가 정상으로 나온다

작업

  • `ReadyModule`이 전환 5초 동안 broadcast 하는 `workout-play-preview`를 컨트롤러가 공용 `resolvePreviewActiveExercise`로 처리해 **첫 운동 1개만 solo(전체화면)** 로 그리던 것이 원인. 카운트다운 오버레이가 사라지는 순간 A1 전체화면이 노출되고 곧 main payload가 도착해 3분할로 교체됐다. 프리뷰 묶음 계산을 순수 함수 `resolveAmrapPreviewGroup`으로 분리해 Main(RND) 프리뷰는 RND 운동 3개를 payload 순서 그대로 3분할로 띄우고, DS/CD·단일 운동 레거시는 solo를 유지. 전환 중 레이아웃이 바뀌지 않아 깜빡임이 없고 5초 동안 영상 3개가 미리 로드된다(RND 시작 시 슬롯 key 일치 → 재로딩 없음). 단위 테스트 5건 추가
  • **Electron(renderer)** · `single/amrap/`(신규), , (신규)

운동설정 싱글 탭 +/- 버튼 복원 · AMRAP Round 상한 스코프별 분기

현상/기능

  • 운동설정의 싱글일 때 +/- 버튼이 없다

작업

  • `showAdjustButtons = !isSingleScope` 게이트로 싱글 탭에서 행 추가/삭제·셀(시간·휴식·물보충·횟수) -/+·COMBO MOVE -/+ 가 모두 숨겨져 있던 것을 제거해 메인과 동일하게 노출. 상태 훅에는 스코프 제약이 없어 UI 게이트만 제거. AMRAP 행 상한이 2로 하드코딩돼 있어 싱글 4 RND(§14)와 어긋나던 문제도 함께 수정 — 에 `AMRAP_ROUND_MIN`/`AMRAP_TOTAL_ROUND_MAX`(2)/`AMRAP_SINGLE_ROUND_MAX`(4)·`getAmrapRoundMax(scope)`를 정식 상수로 두고 카드·훅이 참조, 는 중복 정의 대신 이 값을 재사용. 비COMBO 행 삭제 버튼도 1행일 때 disabled 처리
  • **Web** · `WorkoutSettings/components/`, , , `shared/save-workout/`

1Monitor AMRAP 추가 (RND 3영상 동시 재생 + 다음 RND preload)

현상/기능

  • 에 1Monitor AMRAP 추가. 영상 출력은 `workout_exercises_logic.md` §14 규칙(RND 1~4, RND당 A1/A2/A3 동시 재생, RND2 뒤 물보충)대로 하고 소스를 별도 파일로 분리
  • RND1→RND2, RND2→RND3 전환 시 영상 로딩 시간이 늘지 않게 pre loading. 를 쓰지 않고 AMRAP 전용으로 분리
  • 저장 시 §14 구조로 저장
  • 신규 AMRAP 로직 검증

작업

  • RND 묶음(3슬롯)·타이머 시간·다음 RND 묶음을 계산하는 순수 함수 모듈을 만들고, RND 1회분을 `amrapGroup`(현재)·`nextAmrapGroup`(preload) 한 payload로 broadcast. `workoutPlans` 우선, 없으면 운동 duration 합으로 RND 시간 산출. Main→CD 직전 rest/물보충은 건너뛴다. `SingleCircuitRunner.create`에 `SingleAmrapModule` 등록
  • 슬롯마다 `current`(표시)·`pending`(숨김) player를 유지하는 AMRAP 전용 pool 신설. 다음 RND 영상을 `pending`에 미리 로드해 두고 전환 시 visibility/z-index만 교체(iframe 재생성 없음). 헤더는 SET/MOVE 대신 RND 카운터, 슬롯 라벨은 position(A1/A2/A3)·목표 횟수(`16 ea`). `SingleSequencePayload`에 `amrapGroup`/`nextAmrapGroup` 추가, selector에 `amrap` kind 추가
  • 기존 `saveAMRAP`·는 그대로 두고 Singleexercises 전용 저장 파일 신설. COMBO처럼 grid position(A1~D3) 부여, 패널 행 = RND 개수(1~4), 메인 운동 수를 `RND×3`으로 검증. 저장 API는 `POST /workout-categories/Time-StructuredAMRAP` 유지
  • RND 묶음·물보충 유지·마지막 RND preload 없음·RND 카운터 단위 테스트(11건), 웹 저장 helper 단위 테스트(15건) 추가
  • **Electron(main)** · `single/amrap/`
  • **Electron(renderer)** · `single/amrap/`
  • **Web** · `save-workout/`
  • **Test**

COMBO DS↔Main/CD 구간 전환 5초 통일

현상/기능

  • COMBO도 다른 운동처럼 DS→Main / Main→CD 전환을 5초로 변경

작업

  • countdown 주석/테스트, `workout_exercises_logic.md`
  • COMBO Stress/Loop 전용 전환 상수 30→5초로 맞추고 테스트·렌더러 주석·운동 로직 문서를 갱신. ReadyModule duration 전달 경로는 그대로라 모든 운동이 동일하게 5초 Ready를 쓴다