2026-08-07 PulseUp 작업일지입니다. 오늘은 2건의 작업을 진행했습니다.
1Monitor COMBO Stress 3영상 동시 재생 화면
현상/기능
- 1Monitor COMBO Stress 화면을 첨부 시안(상단 정보 바 + 3분할 영상)대로 만들고 3개 영상을 모두 재생
- 기존 1Monitor처럼 COMBO Stress도 전용 파일로 분리 처리
- SET 시간·휴식·물보충 계산 로직 중복 방지
- 3개 영상이 모두 play 되는 1Monitor COMBO 화면 구성
- 신규 SINGLE COMBO 경로 검증
작업
- SINGLE 런타임에 COMBO 전용 모듈이 없어 MULTI `ComboStressModule`로 떨어지고, 콤보 3개가 개별 `workout-play-sequence`로 fan-out 되어 1Monitor는 마지막 1개만 표시(위·아래는 blur 썸네일)하는 구조임을 확인
- `main/single/`, `main/single/`
- SINGLE 전용 실행 모듈과 메인 라운드를 신규 추가해 SET 1회분(콤보 3개)을 `comboGroup` 배열이 담긴 payload **한 번**으로 broadcast하도록 구현(grid seek·bulk preload 제외). `SingleCircuitRunner`에 `combo-stress` 분기 추가
- `main/workout-modules/circuits/combo-stress/`
- MULTI 의 private 플랜 헬퍼(`getComboSetDuration`/`getComboSetRestDuration`/`getComboWaterDuration`/`getComboStressBreakDuration`/`collectCurrentComboSetExercises`)를 공유 모듈로 추출하고 MULTI·SINGLE 양쪽이 import하도록 변경(동작 변경 없음)
- `renderer/single/combo/`, , , , `renderer/single/`
- 상단 정보 바(WORK·구간·SET·MOVE·TIME·ELAPSED·로고)와 3분할 슬롯 view, 슬롯별 독립 Vimeo player를 동시에 재생하는 전용 풀, 슬롯 라벨(position `A1`·목표 `16 ea`/`8/8 ea`)을 신규 구현. DS/CD 구간은 단일 슬롯(solo) 레이아웃으로 전환하고, ready payload 카테고리로 기존/COMBO 컨트롤러를 선택하도록 selector 추가
- 콤보 3개 단일 payload broadcast, 같은 콤보 다음 SET의 `KEEP_VIDEO` 이어가기, 콤보 전환 시 position·`syncStartAtMs`, 0초 저장 휴식·물보충의 플랜 복구, 목표 라벨 포맷을 테스트로 고정(electron-app 전체 195개 통과)
- **분석** · `main/single/`, `main/workout-modules/circuits/combo-stress/`
- **Test** · `main/single/`, `renderer/single/combo/`
싱글트레이닝 운동편집 COMBO Stress/Loop 추가
현상/기능
- `pages/exercises/Singleexercises`에 combo stress 기능 추가
- COMBO UI 부품 중복 없이 두 페이지 공유
- 싱글트레이닝에서 COMBO Stress·Loop 등록/저장
- COMBO Loop 1Monitor를 COMBO Stress 1Monitor와 같은 화면 형태로 생성
- RND 시간·휴식·물보충 계산 로직 중복 방지
- COMBO Loop도 Stress와 동일한 3분할 화면 사용
- 신규 SINGLE COMBO-Loop 경로 검증
작업
- 공용 저장 로직은 `getMainPositionSortValue("1")`이 숫자를 반환해 linear position(1~12)도 그대로 정렬·3개씩 묶이므로 수정 불필요임을 확인. 부족한 것은 페이지·에디터 UI와 `saveCOMBO` 연결뿐임을 확인하고 범위를 확정
- Totalexercises/components에 있던 두 파일(특정 페이지 의존 없음)을 `exercises/shared/`로 이동하고 Totalexercises import 2곳을 갱신. Singleexercises는 같은 경로에서 그대로 사용
- COMBO 분기(`isCombo`)와 `comboMoveCount` 상태를 추가해 WorkoutSettings(`workoutScope=SINGLE`)의 MOVE·Set 값을 불러오고, 에디터 좌측 패널을 `ComboRoundPanel`(Set 1~n·시간·휴식·마지막 Set 물보충)로 교체. 메인 목록에 횟수 컬럼을 열고 Set 1·2·3 횟수를 목록 순서 슬롯에 동기화, MOVE×3 개수 검증 후 `saveCOMBO`(workout_scope=SINGLE, sequenceMode=linear)로 저장하며 총 운동시간도 COMBO 규칙으로 계산
- `main/single/`, `main/single/`, `main/single/`
- SINGLE 전용 COMBO-Loop 실행 모듈과 메인 라운드를 신규 추가해 MOVE 1회분(콤보 3개)을 `comboGroup` payload 한 번으로 broadcast(grid seek·slot advance·preload 제외). `SingleCircuitRunner`에 `combo-loop` 분기 추가
- `main/workout-modules/circuits/combo-loop/`
- MULTI 의 private 플랜 헬퍼(`getComboLoopRoundPlan`/`getComboLoopMoveDuration`/`getComboLoopWaterDuration`/`getComboLoopRestDuration`/`getComboLoopBreakDuration`/`collectCurrentComboLoopMoveExercises`)를 공유 모듈로 추출하고 MULTI·SINGLE 양쪽이 import하도록 변경(동작 변경 없음)
- `renderer/single/combo/`, , `renderer/single/`
- 상단 카운터 라벨을 `SET`/`RND`로 주입받도록 view·controller를 확장하고, selector의 `SinglePlaybackKind`를 `default | combo-stress | combo-loop`로 나눠 방식별 라벨을 지정. 화면·영상 풀·슬롯 라벨·WORK 카운트(`combo-moves`)는 Stress 구현을 그대로 재사용
- 콤보 3개 단일 payload broadcast, RND 고정·콤보 순환 시 RND별 플랜 시간 적용, 같은 콤보 반복 시 `KEEP_VIDEO`, 0초 저장 휴식·물보충의 플랜 복구, grid 전환 이벤트 미발생을 테스트로 고정(electron-app 200개·web-app 65개 전체 통과)
- **분석** · `Singleexercises/*`, `shared/save-workout/`
- **Web** · `exercises/shared/`, `exercises/shared/`
- **Web** · `Singleexercises/`, `Singleexercises/components/`, `components/`, `components/`
- **Test** · `main/single/`