# 18. Paused Session Re-entry Spec Last Updated: 2026-03-15 이 문서는 VibeRoom에서 **진행 중인 세션 / 멈춘 세션 / 쉬는 시간**을 어떻게 다르게 취급할지, 그리고 사용자가 `/app`에 들어왔을 때 어떤 경로로 다시 `/space`에 진입해야 하는지를 정의한다. 핵심 목적은 하나다. > session state에 따라 `/app`과 `/space`의 역할을 정확히 나누고, > 사용자가 “지금 내가 어떤 상태인지”를 설명할 수 있는 premium UX를 만든다. 관련 문서: - `09_app_entry_detailed_spec.md` - `10_refocus_system_spec.md` - `11_away_return_recovery_spec.md` - `15_app_stats_entry_flow_spec.md` - `16_product_alignment_audit_plan.md` - `17_product_alignment_findings.md` - `../../product_principles.md` - `../../current_context.md` --- ## 1. 문제 정의 지금까지의 혼란은 대부분 여기서 시작됐다. - `세션` - `타이머` - `pause` - `break` - `return` 을 충분히 분리하지 않고 써 왔다. 그 결과: - 사용자는 `타이머가 멈춰 있으면 다 paused인가?`를 헷갈린다 - `/app`에서 `resume`이 primary인지, `새로 시작`이 가능한지 흐려진다 - `잠시 비우기`와 `break`의 의미가 섞인다 이 spec은 그 상태 정의를 먼저 고정한다. --- ## 2. 한 줄 정의 > running session은 바로 `/space`로 복귀시키고, > paused session은 `/app`에서 다시 이어갈지 정하게 하되, > 사용자가 `이어가기`를 눌렀다면 `/space`에서는 다시 묻지 않고 바로 resume한다. --- ## 3. 상태 정의 ### Session 사용자가 현재 책임지고 있는 하나의 focus block. 조건: - goal이 있다 - 아직 명시적으로 닫지 않았다 - 다시 이어갈 수 있다 ### Running Focus - 현재 focus 타이머가 진행 중 - 사용자는 같은 goal 안에서 작업 중 ### Paused Focus - 사용자가 의도적으로 pause를 눌렀다 - 같은 goal은 아직 살아 있다 - 기본값은 `resume` ### Running Break - focus block은 끝났다 - break 타이머가 진행 중이다 - 이건 paused session이 아니다 ### Return - 사용자가 pause를 누르지 않고 떠났다가 돌아온 상태 - system이 recovery 선택지를 먼저 제안하는 상태 ### Closed Session - `여기서 마무리하기`로 끝낸 상태 - 더 이상 current session이 아니다 --- ## 4. 제품 원칙 ### 1. Running은 다시 결정하게 하지 않는다 이미 running이면 사용자의 다음 행동은 “다시 정하기”가 아니라 “복귀”다. 즉: - `/app`에서 hero를 다시 보여주지 않는다 - 바로 `/space`로 보낸다 ### 2. Paused는 자동 재생하지 않는다 pause는 사용자의 명시적 멈춤이다. 즉: - `/app`에 들어왔다고 자동 resume하지 않는다 - 사용자가 직접 `이어가기`를 눌러야 한다 ### 3. Explicit Continue 이후에는 다시 묻지 않는다 사용자가 `/app`에서 `이어가기`를 눌렀다면, 그건 이미 “다시 하겠다”는 결정을 내린 것이다. 즉: - `/app -> /space -> 다시 start 클릭` 금지 - `/space` 진입과 동시에 resume해야 한다 ### 4. `/app`은 decision surface, `/space`는 execution surface - `/app`: 이어갈지 / 다시 정리할지 / 새 목표로 전환할지 - `/space`: 실제로 일하는 곳 이 둘이 같은 결정을 두 번 요구하면 실패다. ### 5. 새 시작은 current session이 없을 때만 direct paused session이 있는데 새 목표를 바로 시작하게 하면 회피 루프와 상태 오염이 생긴다. 즉: - current session이 없을 때만 direct start - current session이 있을 때 새 start는 explicit takeover flow로만 허용 --- ## 5. 라우팅 정책 ### Rule A. Running Focus 상태: - current session 존재 - `state = running` - `phase = focus` 처리: - `/app` 진입 시 즉시 `/space` 이유: - 이미 실행 중인 일은 다시 commitment gate에 세우면 안 된다 ### Rule B. Running Break 상태: - current session 존재 - `state = running` - `phase = break` 처리: - `/app` 진입 시 즉시 `/space` 이유: - break도 현재 세션의 일부다 - `/app`에서 다시 decision을 시키면 break/return 의미가 흐려진다 ### Rule C. Paused Focus 상태: - current session 존재 - `state = paused` - `phase = focus` 처리: - `/app` 진입 - `resume gate` 노출 이유: - pause는 사용자의 의도적 멈춤이므로 존중해야 한다 - 하지만 같은 goal을 다시 이어갈지 결정할 여지를 줘야 한다 ### Rule D. No Session / Closed Session 상태: - current session 없음 처리: - `/app` 진입 - single-goal start hero 노출 --- ## 6. `/app` paused state UX ### 목적 사용자가 “멈춘 세션이 아직 살아 있다”는 것을 즉시 이해하고, 한 번의 결정으로 `/space`에 다시 들어가게 만드는 것. ### 정보 구조 resume card 안에는 아래만 둔다. - 현재 goal - 마지막 microStep - 현재 상태 문구 - 예: `잠시 멈춘 세션이 있어요` - primary CTA - quiet secondary actions ### Primary CTA - `이어서 몰입하기` 동작: - 클릭 - `/space`로 이동 - 자동 resume ### Secondary - `한 조각 다시 잡기` - `주간 review 보기` ### Tertiary - `새 목표로 전환` 중요: - new start가 아니다 - takeover flow 진입점이다 - server도 current session이 남아 있으면 direct start를 거절해야 한다 --- ## 7. `/space` 재진입 동작 ### Resume CTA 이후 `/app`에서 `이어서 몰입하기`를 눌렀다면: - `/space`로 이동 - 별도의 start 버튼 재요구 금지 - 부드러운 transition 후 자동 resume 추천: - 300~800ms 정도의 soft transition - 필요하면 아주 짧은 re-entry settle animation 금지: - `/space`에서 다시 `시작`을 누르게 하는 것 - resume 직후 또 다른 decision tray를 띄우는 것 ### Refocus CTA 이후 `한 조각 다시 잡기`를 눌렀다면: - refocus를 먼저 거친다 - 그 후 `/space` 진입과 함께 자동 resume 즉, refocus는 decision이고, `/space`는 execution이다. --- ## 8. Takeover Flow paused session이 있을 때 새 goal direct start는 허용하지 않는다. 대신 아래 흐름으로만 간다. ### Trigger - `/app` paused state에서 `새 목표로 전환` ### Confirm Sheet 질문: - `현재 멈춘 세션을 어떻게 할까요?` 선택지: - `이어서 하기` - `이 세션은 여기서 정리하고 새로 시작` - `취소` ### 동작 원칙 - `이어서 하기` - sheet 닫기 - resume card 유지 - `이 세션은 여기서 정리하고 새로 시작` - current session을 명시적으로 닫는다 - 그 다음 `/app` single-goal start 상태로 전환한다 - `취소` - sheet 닫기 중요: - silent abandon 금지 - paused session 위에 새 session을 덮어쓰기 금지 --- ## 9. Weekly Review와의 관계 paused state에서도 review는 열 수 있어야 한다. 하지만 위계는 아래처럼 고정한다. ### paused state - primary: `이어서 몰입하기` - secondary: `한 조각 다시 잡기` - quiet secondary: `주간 review 보기` 즉: - review를 숨기면 안 된다 - resume보다 앞세우면 안 된다 --- ## 10. 금지사항 - running session인데 `/app` hero를 보여주는 것 - paused 상태에서 `/app` 진입만으로 자동 resume - `/app`에서 `이어가기`를 눌렀는데 `/space`에서 다시 start를 요구하는 것 - paused session 위에서 direct new start 허용 - break를 paused session처럼 취급하는 것 - takeover 없이 silent abandon 하는 것 --- ## 11. 구현 순서 ### Slice 1. Session Routing Contract 범위: - `/app` 진입 시 current session state에 따른 route policy 고정 포함: - `running focus -> /space` - `running break -> /space` - `paused focus -> /app` - `no session -> /app` 완료 조건: - 상태별 route policy가 코드와 문서에서 동일하다 ### Slice 2. `/app` Paused Resume Gate 범위: - paused state의 resume card UX 정리 포함: - primary `이어서 몰입하기` - `한 조각 다시 잡기` - quiet `주간 review 보기` - state copy 정리 완료 조건: - paused 사용자가 다음 행동을 2초 안에 이해할 수 있다 ### Slice 3. `/space` Auto-Resume Handoff 범위: - `/app` resume CTA 이후 `/space` 진입 시 자동 resume 포함: - explicit continue 이후 double-confirm 제거 - transition quality 보정 완료 조건: - `/app -> /space -> start` 이중 클릭이 사라진다 ### Slice 4. Takeover Flow 범위: - paused session 위에서 new start를 하고 싶을 때의 명시적 처리 포함: - confirm sheet - close-and-start-new 경로 - silent abandon 방지 완료 조건: - paused session 상태에서 새 목표 전환이 상태 오염 없이 가능하다 ### Slice 5. Browser QA 반드시 확인할 시나리오: 1. running focus 상태에서 `/app` 진입 2. running break 상태에서 `/app` 진입 3. paused focus 상태에서 `/app` 진입 4. paused -> `이어서 몰입하기` 5. paused -> `한 조각 다시 잡기` 6. paused -> `주간 review` 7. paused -> `새 목표로 전환` --- ## 12. 성공 기준 - 사용자가 현재 상태를 설명할 수 있다 - running이면 `/space`, paused면 `/app`이라는 규칙이 일관된다 - paused에서의 primary CTA는 항상 `resume`이다 - explicit continue 이후에는 다시 start를 요구하지 않는다 - new start는 current session이 없을 때만 direct다 --- ## 13. 최종 판단 VibeRoom이 world-class가 되려면 `멈춤`, `쉬기`, `복귀`, `새 시작`을 같은 것으로 취급하면 안 된다. 가장 중요한 원칙은 이거다. > 이미 실행 중인 것은 바로 복귀시키고, > 의도적으로 멈춘 것은 다시 결정하게 하되, > 다시 하겠다고 결정한 뒤에는 한 번 더 묻지 않는다.