세션 완료 화면 즉시 저장 전환 — 진입 자동 저장·되돌아가기 제거 (2026-09-01)
- 기간: 2026-08-31 ~ 2026-09-01 (2세션 — 구현
519ba1e4, 충돌 해소·e2e 수리·랜딩d0ddeb46. 오너 방식 A 확정 08-31, 인계 지시: "1021 충돌도 네가 풀어줄래?") - 랜딩: PR #1021(
ea5ee297) — 프론트 전용(마이그레이션 없음), Vercel 자동 배포 - 설계서: 없음(방식 A 확정 내용은 PR 본문·이슈 #1017)
- 정본:
WorkoutFlow.tsx(진입 자동 저장 effect·종료 확인 팝업),WorkoutFinish.tsx(버튼 카피·안내/오류 배너),workoutWriteController.ts(saveUiWorkoutSession {stayOpen}·연결 장애 표식), 경계activeWorkoutCommands.finishAndStay/deleteSaved - 도구: 로컬 샌드박스 스택 + Playwright 로컬 실행(실패 재현→트레이스의 요청/응답 실측), DB 프로브(잠복 서버 버그 격리)
- 게이트: 브라우저 e2e 21케이스(CASE-015는 3회 장애 계약으로 갱신) +
case015WriteSurvivalContract계약 테스트 - 버그리포트: 없음(이 트랙에서 발견된 서버 잠복 버그는 이슈 #1034로 분리 — 수리 시 작성)
- 계약: CASE-015
case.json선언 503 창 1..3,USER-JOURNEY.md/README.md동조
1. 배경
운동 완료 화면이 "저장 전 확인 화면"이라, 유저가 완료 화면까지 가고도 저장 버튼을 안 누르면 기록이 서버에 없었다. 오너 방식 A: 완료 화면을 "저장된 결과의 마무리 화면"으로 전환 — 종료 확인 팝업 1회 → 완료 화면 진입과 동시에 자동 저장, "한 세트만 더" 되돌아가기 제거, 메모·시간을 고치면 나갈 때 변경분만 한 번 더 반영.
2. 문제 제기 (랜딩 국면)
구현 PR #1021은 Actions 결제 차단기에 작성돼 자기 e2e를 한 번도 돌려보지 못한 채 대기했고, 그 사이 main과 충돌이 쌓였다. CI 복구(#1024) 후 첫 실행에서 e2e 5케이스(CASE-001·004·015·021·022)가 실패.
3. 해결 방안
원칙 = 오너 방식 A 유지, 실패는 스펙 완화가 아니라 실원인 수리. 로컬 재현(Playwright 트레이스에서 요청·응답 실측)으로 원인 3건을 가려 각각 수리.
4. 적용한 내용
- main 병합 충돌 해소(
cf3d5896): eslint 억제 주석 문구는 main 채택, baseline에 이 트랙 신규 억제 1건 등재. force-push 없음. - 시작 시각 0시·0분 오염 수리(main에도 있던 표시 버그): 완료 화면 시각 초기화가
parseInt(...) || 18/30이라 0이 falsy로 버려져 — 자정 넘겨 00:19에 시작한 운동이 18:19로 표시되고, 정각(00분) 시작은 30분으로 표시됐다. 이 트랙에서는 자동 저장값과 달라져 "값이 바뀌었다" 오판 → 불필요한 수정 저장까지 발동(4케이스 400의 뿌리). 정수 판정으로 보존. - 오프라인 자동 저장은 오류가 아니라 안내: 연결 장애로 자동 저장이 실패하면 컨트롤러가 연결 상태 경고로 이미 기록하므로, 화면은 표식(
barbelicConnectivityHandled)을 보고 info 배너("연결이 불안정해 아직 저장하지 못했어요…")만 그린다 — 오류 이벤트·오류 표면 0 계약(e2e 완료 게이트) 준수. 저장 버튼 → 대기열 보관 경로는 종전 그대로. - CASE-015 계약 동조: 진입 자동 저장이 앞에 붙어 선언 503이 2→3회(4회째 실성공). case.json·계약 테스트·여정 문서 갱신.
작업 중 드러난 것 — 서버 잠복 버그 분리(이슈 #1034): 완료 세션 수정(update_completed_session_v4)은 세트를 지우고 다시 만드는데, 통계 롤업의 근거 세트 FK(ON DELETE SET NULL)와 CHECK("관측이 있으면 근거 세트 필수")가 충돌해 — 반복수 기록 종목이 든 세션은 통계 반영 후엔 어떤 경로로든 수정이 23514로 영구 거부된다. 저장→통계 처리→수정 순서의 DB 프로브로 main에서도 재현 확정. 이 트랙과 무관한 기존 버그라 분리.
5. 적용 결과
| 항목 | 전 | 후 |
|---|---|---|
| 완료 화면 저장 | 저장 버튼을 눌러야 저장 | 진입 즉시 자동 저장(오너 방식 A), 실패 시 수동 저장 폴백 |
| 이 트랙 e2e | 5/21 실패(한 번도 미실행이라 잠복) | 21/21 PASS(로컬 + CI run 33409877759) |
| 자정 이후·정각 시작 시각 | 완료 화면에 18:30 계열로 오염 표시 | 실제 시각 그대로 |
| 오프라인 완료 진입 | (신규 경로) 오류 배너+오류 이벤트 이중 기록 | 안내 배너 1개, 이벤트는 연결 경고 1건 |
미검증(자동 증거 범위 밖): 실기기 감각 품질(배너 톤·팝업 문구의 체감)은 시각 판단 영역.
6. 이번 개선으로 향상된 것
- 유저 A가 운동을 마치고 "운동 종료"를 확인하면 그 순간 기록이 서버에 있다 — 완료 화면에서 앱을 꺼도 기록이 살아 있고 "진행 중인 운동"으로 되살아나지 않는다.
- CI 차단기에 랜딩·대기한 묶음의 잠복(낡은 기대·미실행 e2e)을 "실원인 수리 우선" 절차로 걷어내는 선례(#1024에 이어 2번째).
남은 것
- 이슈 #1034: 완료 화면에서 메모·시간을 실제로 고친 유저는 반영 저장이 같은 서버 버그(23514)에 걸릴 수 있다(실패 배너+재시도 안내는 뜸) — 서버 수리 트랙에서 해소.