Files
viberoom-web/docs/18_paused_session_reentry_spec.md

9.6 KiB

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 진입점이다

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가 되려면 멈춤, 쉬기, 복귀, 새 시작을 같은 것으로 취급하면 안 된다.

가장 중요한 원칙은 이거다.

이미 실행 중인 것은 바로 복귀시키고,
의도적으로 멈춘 것은 다시 결정하게 하되,
다시 하겠다고 결정한 뒤에는 한 번 더 묻지 않는다.