체크포인트 유령 부활 수리 — 저장한 운동이 "진행중"으로 되살아나던 결함 (2026-08-31)
- 기간: 2026-08-30 (1세션, 오너: "#923 작업좀 진행해줘" — 출시 전 전면 감사가 발견한 결함)
- 랜딩: PR #930(Phase 1,
a5957ae2) · PR #933(Phase 2,c6f5006e) — 마이그레이션 20260831130000, Vercel 배포 - 설계서: 없음(수리 건) — 분석·Phase 계획은 이슈 #923 쓰레드
- 정본: 이 수리의 상세는 bug-report/bug-044-20260830.md가 정본이다
- 게이트: 클라 회귀 테스트 4건(
tests/react/workoutDraftCheckpoint.test.mjs) + pgTAP 8건(supabase/tests/database/workout_draft_checkpoint_commit_guard_v1.test.sql) - 버그리포트:
bug-report/bug-044-20260830.md
Phase 현황
| Phase | 내용 | 상태 |
|---|---|---|
| Phase 1 | 저장·삭제 시 백업 예약 타이머 취소 + 삭제 순서 보장 (클라) | ✅ PR #930 (a5957ae2) |
| Phase 2 | 부팅 조회에서 저장 완료된 운동의 백업 자동 소멸 (서버+클라) | ✅ PR #933 (c6f5006e) |
| Phase 3 | 버그리포트·작업 기록 | ✅ 본 문서 |
요약
진행중 운동의 서버 자동 백업(#887)은 60초에 한 번만 올리는 제한 때문에 "60초 뒤 마지막 상태 올리기" 예약을 걸어두는데, 저장·삭제가 백업을 지우면서 이 예약을 취소하지 않았다. 예약이 뒤늦게 실행되어 지운 백업을 되살렸고, 다음 부팅에서 이미 저장한 운동이 "진행중이던 운동" 팝업으로 부활했다(이어하기 재저장은 LG001 반복). 저장 시 예약을 함께 취소하고(Phase 1), 남은 유령은 부팅 조회에서 서버가 스스로 지우게 했다(Phase 2). 원인·대안·재발 방지 상세는 버그리포트 참조.
적용 결과
| 항목 | 전 | 후 |
|---|---|---|
| 재현 시나리오(편집 → 60초 내 저장 → 재부팅) 팝업 | 항상 발생 | 0 (회귀 테스트 고정) |
| 취소·부팅 자정 회귀 테스트 | 0건 | 클라 4건 + pgTAP 8건 |
| Production 유령 백업(저장 완료된 운동의 백업 행) | 표본 1일 0행 | 부팅 조회 시 구조적으로 소멸 |
오너 실기기 확인 완료(2026-08-31): 운동 저장 → 재부팅 → 팝업 없음.
남은 것
- 없음 — 오너 실기기 확인 완료, 이슈 #923 [반영완료] 종결(2026-08-31).