9.7 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.md10_refocus_system_spec.md11_away_return_recovery_spec.md15_app_stats_entry_flow_spec.md16_product_alignment_audit_plan.md17_product_alignment_findings.md../../product_principles.md../../current_context.md
1. 문제 정의
지금까지의 혼란은 대부분 여기서 시작됐다.
세션타이머pausebreakreturn
을 충분히 분리하지 않고 써 왔다.
그 결과:
- 사용자는
타이머가 멈춰 있으면 다 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 = runningphase = focus
처리:
/app진입 시 즉시/space
이유:
- 이미 실행 중인 일은 다시 commitment gate에 세우면 안 된다
Rule B. Running Break
상태:
- current session 존재
state = runningphase = break
처리:
/app진입 시 즉시/space
이유:
- break도 현재 세션의 일부다
/app에서 다시 decision을 시키면 break/return 의미가 흐려진다
Rule C. Paused Focus
상태:
- current session 존재
state = pausedphase = 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
/apppaused state에서새 목표로 전환
Confirm Sheet
질문:
현재 멈춘 세션을 어떻게 할까요?
선택지:
이어서 하기이 세션은 여기서 정리하고 새로 시작취소
동작 원칙
-
이어서 하기- sheet 닫기
- resume card 유지
-
이 세션은 여기서 정리하고 새로 시작- current session을 명시적으로 닫는다
- 그 다음
/appsingle-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인데
/apphero를 보여주는 것 - 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 -> /spacerunning break -> /spacepaused focus -> /appno 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
범위:
/appresume 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
반드시 확인할 시나리오:
- running focus 상태에서
/app진입 - running break 상태에서
/app진입 - paused focus 상태에서
/app진입 - paused ->
이어서 몰입하기 - paused ->
한 조각 다시 잡기 - paused ->
주간 review - paused ->
새 목표로 전환
12. 성공 기준
- 사용자가 현재 상태를 설명할 수 있다
- running이면
/space, paused면/app이라는 규칙이 일관된다 - paused에서의 primary CTA는 항상
resume이다 - explicit continue 이후에는 다시 start를 요구하지 않는다
- new start는 current session이 없을 때만 direct다
13. 최종 판단
VibeRoom이 world-class가 되려면
멈춤, 쉬기, 복귀, 새 시작을 같은 것으로 취급하면 안 된다.
가장 중요한 원칙은 이거다.
이미 실행 중인 것은 바로 복귀시키고,
의도적으로 멈춘 것은 다시 결정하게 하되,
다시 하겠다고 결정한 뒤에는 한 번 더 묻지 않는다.