docs(docs): 화면별 current와 archive 구조로 분리
This commit is contained in:
@@ -1,437 +0,0 @@
|
||||
# 15. `/app -> /stats -> /app` Weekly Review Entry Flow Spec
|
||||
|
||||
Last Updated: 2026-03-15
|
||||
|
||||
이 문서는 VibeRoom의 `Weekly Review`를 **어디서, 왜, 어떤 타이밍에 열어야 하는지**를 정의하는 진입 플로우 문서다.
|
||||
|
||||
핵심 목적은 하나다.
|
||||
|
||||
> `/stats`를 고립된 summary page가 아니라, `/app`의 다음 세션 시작 성공률을 높여주는 review ritual로 코어 루프 안에 넣는다.
|
||||
|
||||
관련 문서:
|
||||
|
||||
- `./19_app_atmosphere_entry_spec.md`
|
||||
- `../../product/12_core_loop_execution_roadmap.md`
|
||||
- `../stats/14_weekly_review_reframe_spec.md`
|
||||
- `../../product_principles.md`
|
||||
- `../../current_context.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 문제 정의
|
||||
|
||||
현재 구현 기준에서 `/stats`는 route는 존재하지만,
|
||||
제품 루프 안에서의 진입 이유가 약하다.
|
||||
|
||||
현재 문제:
|
||||
|
||||
- `/stats`는 사실상 고립된 페이지다
|
||||
- 사용자가 왜 지금 review를 봐야 하는지 맥락이 없다
|
||||
- `/space`에서 바로 review로 튀면 execution 흐름을 끊는다
|
||||
- `/app`과 `/stats`가 연결되지 않아, review가 다음 세션 시작으로 이어지지 않는다
|
||||
|
||||
즉, 지금 `/stats`는 “있을 수는 있는 페이지”지만
|
||||
**사용자가 자연스럽게 보게 되는 페이지는 아니다.**
|
||||
|
||||
---
|
||||
|
||||
## 2. 한 줄 정의
|
||||
|
||||
> Weekly Review의 primary flow는 `/app`에서 review teaser를 보고, `/stats`에서 지난 7일의 집중 리듬을 짧게 정리한 뒤, 다시 `/app`으로 돌아와 다음 세션을 시작하는 흐름이다.
|
||||
|
||||
---
|
||||
|
||||
## 3. 제품 원칙
|
||||
|
||||
### 1. `/stats`의 primary entry는 `/app`이다
|
||||
|
||||
- review는 “지금 일하는 중에 보는 것”이 아니라
|
||||
- “다음 세션을 시작하기 직전에 확인하는 것”이다
|
||||
|
||||
### 2. `/space`는 review의 메인 진입점이 아니다
|
||||
|
||||
- `/space`는 execution surface다
|
||||
- review는 boundary ritual이어야 한다
|
||||
- `/space`에서는 teaser만 허용하고, full review로의 강한 유도는 금지한다
|
||||
|
||||
### 3. review는 다음 행동으로 연결되어야 한다
|
||||
|
||||
- `/stats`는 읽고 끝나는 페이지가 아니다
|
||||
- 마지막 CTA는 반드시 `/app`의 next session start와 연결돼야 한다
|
||||
|
||||
### 4. review 진입은 “보면 좋음”이 아니라 “지금 보면 의미 있음”이어야 한다
|
||||
|
||||
- 무조건 항상 띄우지 않는다
|
||||
- 데이터가 충분하고, 지금 보는 것이 실제로 의미 있을 때만 노출한다
|
||||
|
||||
### 5. review는 planning이 아니라 focus optimization이다
|
||||
|
||||
- 할 일 정리로 이어지면 실패
|
||||
- 다음 세션의 시작 조건을 더 잘 맞추는 흐름이어야 한다
|
||||
|
||||
---
|
||||
|
||||
## 4. 왜 `/app`이 primary entry인가
|
||||
|
||||
`/app`은 commitment gate다.
|
||||
즉 사용자가 “지금 한 가지를 붙잡고 들어가겠다”는 결정을 내리는 곳이다.
|
||||
|
||||
review가 가장 유의미한 순간도 바로 여기다.
|
||||
|
||||
왜냐하면:
|
||||
|
||||
- review를 보고 바로 다음 세션을 시작할 수 있다
|
||||
- `/space`보다 맥락이 느슨해서 회고가 자연스럽다
|
||||
- `/stats`를 planner page처럼 쓰지 않고 entry ritual로 흡수할 수 있다
|
||||
|
||||
반대로 `/space`는:
|
||||
|
||||
- 이미 실행 중인 화면이고
|
||||
- review가 들어오면 흐름을 끊고
|
||||
- 제품을 dashboard처럼 보이게 만들 수 있다
|
||||
|
||||
결론:
|
||||
|
||||
- `/app`은 review를 여는 문
|
||||
- `/stats`는 주간 review desk
|
||||
- `/app`으로 돌아와 다시 시작
|
||||
|
||||
이 삼각 구조가 가장 맞다.
|
||||
|
||||
---
|
||||
|
||||
## 5. 사용자 플로우
|
||||
|
||||
### Primary Flow
|
||||
|
||||
`/app -> /stats -> /app`
|
||||
|
||||
1. 사용자가 `/app`에 들어온다
|
||||
2. entry stage 바깥의 quiet review dock에 `weekly review entry`가 보인다
|
||||
3. 사용자가 teaser를 누른다
|
||||
4. `/stats`로 이동한다
|
||||
5. review를 본다
|
||||
6. 하단 CTA `이 흐름으로 다음 세션 시작`
|
||||
7. `/app`으로 돌아온다
|
||||
8. review에서 이어온 ritual/context를 가지고 바로 start한다
|
||||
|
||||
핵심:
|
||||
|
||||
- review는 `/app`을 대체하지 않는다
|
||||
- review는 `/app`을 보조한다
|
||||
- review를 보고 다시 `/app`으로 돌아오는 구조가 중요하다
|
||||
|
||||
### Secondary Flow
|
||||
|
||||
`/space complete -> teaser -> /stats`
|
||||
|
||||
1. 사용자가 `/space`에서 세션을 마친다
|
||||
2. complete flow가 끝난다
|
||||
3. 조건이 충족되면 작은 review teaser만 보여준다
|
||||
4. 사용자가 원할 때만 `/stats`로 간다
|
||||
|
||||
중요:
|
||||
|
||||
- `/space`에서는 full review를 메인 행동으로 밀지 않는다
|
||||
- complete tray를 review 유도 UI로 바꾸지 않는다
|
||||
|
||||
### Tertiary Flow
|
||||
|
||||
`profile / secondary nav -> /stats`
|
||||
|
||||
- 다시 review를 보고 싶은 사용자를 위한 명시적 진입
|
||||
- 메인 CTA는 아니다
|
||||
|
||||
---
|
||||
|
||||
## 6. `/app`에서 review teaser를 언제 보여줄 것인가
|
||||
|
||||
항상 보여주면 안 된다.
|
||||
“지금 봐도 의미 없음” 상태에서는 review가 노이즈가 된다.
|
||||
|
||||
### 노출 조건
|
||||
|
||||
기본 규칙:
|
||||
|
||||
- 최근 7일 started session >= 3
|
||||
|
||||
추가 강화 조건:
|
||||
|
||||
- completed session >= 2
|
||||
또는
|
||||
- returned after pause >= 1
|
||||
|
||||
즉,
|
||||
|
||||
- 데이터가 너무 적으면 teaser를 숨긴다
|
||||
- 최소한 “이번 주 리듬”이라고 부를 수 있을 만큼 쌓였을 때만 연다
|
||||
|
||||
### 노출하지 않는 경우
|
||||
|
||||
- 첫 1~2회 사용
|
||||
- 세션 기록이 거의 없는 주
|
||||
- current session이 있고 review 데이터도 거의 없는 상황
|
||||
|
||||
이 경우:
|
||||
|
||||
- `/app` no-session 상태에서는 goal/duration/atmosphere entry stage에 집중
|
||||
- resume 상태에서는 entry shell 대신 resume card 안의 조용한 secondary entry로 review를 연다
|
||||
|
||||
---
|
||||
|
||||
## 7. `/app` review dock 설계
|
||||
|
||||
### 위치
|
||||
|
||||
추천 위치:
|
||||
|
||||
- desktop에서는 entry stage 우측 또는 우상단 quiet dock
|
||||
- mobile에서는 entry stage 아래의 얇은 secondary panel
|
||||
|
||||
금지:
|
||||
|
||||
- entry stage보다 위
|
||||
- entry CTA와 같은 무게
|
||||
- card 3개 중 하나처럼 보이게 배치
|
||||
|
||||
### 형태
|
||||
|
||||
- low-emphasis secondary panel
|
||||
- 작고 조용한 one-liner + secondary CTA
|
||||
|
||||
예시:
|
||||
|
||||
- `이번 주엔 오전 시작에서 가장 오래 이어졌어요`
|
||||
- `pause 뒤 복귀 3회 · review 보기`
|
||||
|
||||
### CTA
|
||||
|
||||
- `주간 review 보기`
|
||||
|
||||
보조 문구:
|
||||
|
||||
- `다음 세션 전에 가볍게 보고 갈 수 있어요`
|
||||
|
||||
### UX 원칙
|
||||
|
||||
- teaser는 insight를 다 말하지 않는다
|
||||
- review를 보고 싶게 만들되, entry stage를 가리지 않는다
|
||||
- start CTA보다 절대 커 보이면 안 된다
|
||||
|
||||
---
|
||||
|
||||
## 8. `/stats` 내부 플로우
|
||||
|
||||
### 진입 직후
|
||||
|
||||
- 이번 주 snapshot hero
|
||||
- start / recovery / completion
|
||||
- carry forward
|
||||
|
||||
### 마지막 CTA
|
||||
|
||||
review의 마지막 CTA는 아래 중 하나여야 한다.
|
||||
|
||||
- `이 흐름으로 다음 세션 시작`
|
||||
- `이 조합으로 /app 돌아가기`
|
||||
|
||||
추천:
|
||||
|
||||
- CTA를 `/app?review=weekly&preset=...` 같은 방식으로 연결
|
||||
- 최소한 query 또는 client state로 ritual/context를 넘긴다
|
||||
|
||||
중요:
|
||||
|
||||
- `/stats`에서 바로 `/space`로 가지 않는다
|
||||
- `/app`을 다시 거치게 해서 commitment gate를 유지한다
|
||||
|
||||
왜냐하면:
|
||||
|
||||
- review 후에도 goal은 다시 내가 정해야 한다
|
||||
- VibeRoom의 핵심은 single-goal commitment이지, review에서 바로 auto-start가 아니다
|
||||
|
||||
---
|
||||
|
||||
## 9. `/app` 복귀 후 UX
|
||||
|
||||
### 복귀 상태
|
||||
|
||||
`/stats`에서 온 경우 `/app`은 plain 상태가 아니라
|
||||
review-aware state가 된다.
|
||||
|
||||
보여줄 것:
|
||||
|
||||
- “방금 본 review 기준 추천” 한 줄
|
||||
- review carry-forward hint
|
||||
- optional atmosphere / ritual hint
|
||||
|
||||
예시:
|
||||
|
||||
- `이번 주에 가장 잘 맞았던 흐름 · Forest · 50/10`
|
||||
- `이번엔 시작을 더 작게 잡아보세요`
|
||||
|
||||
### 유지할 것
|
||||
|
||||
- goal은 여전히 사용자가 직접 입력
|
||||
- goal과 duration은 여전히 사용자가 직접 입력
|
||||
|
||||
자동으로 하지 말 것:
|
||||
|
||||
- goal 자동 채우기
|
||||
- 바로 `/space`로 보냄
|
||||
- todo/list를 다시 불러옴
|
||||
|
||||
즉 review는:
|
||||
|
||||
- 방향을 준다
|
||||
- 하지만 결정을 대신하진 않는다
|
||||
|
||||
---
|
||||
|
||||
## 10. Free / Pro 차이
|
||||
|
||||
### Free
|
||||
|
||||
- `/app` teaser는 1개만
|
||||
- `/stats`에서는 이번 주 snapshot + start / recovery / completion 핵심까지만
|
||||
- return CTA는 generic
|
||||
- `이 흐름으로 다음 세션 시작`
|
||||
|
||||
### Pro
|
||||
|
||||
- teaser가 더 구체적일 수 있다
|
||||
- `Forest · 50/10에서 pause 뒤 복귀율이 가장 높았어요`
|
||||
- `/stats` 마지막 CTA가 더 개인화된다
|
||||
- `가장 잘 맞은 ritual로 /app 돌아가기`
|
||||
- `/app` 복귀 후 ritual prefill / carry-forward hint가 더 정교하다
|
||||
|
||||
핵심:
|
||||
|
||||
- Pro는 더 많은 review가 아니라
|
||||
- 더 정확한 next-session handoff를 판다
|
||||
|
||||
---
|
||||
|
||||
## 11. UI/UX 원칙
|
||||
|
||||
### `/app` review dock
|
||||
|
||||
- entry stage보다 작음
|
||||
- 한 줄 summary
|
||||
- secondary CTA
|
||||
- glass/card를 크게 쓰지 않음
|
||||
|
||||
### `/stats`
|
||||
|
||||
- calm review desk
|
||||
- 읽고 이해하고, 마지막에 행동 하나를 고르는 구조
|
||||
|
||||
### `/app` return state
|
||||
|
||||
- 다시 시작하는 감각 유지
|
||||
- review를 보고 왔다고 해서 `/app`이 dashboard처럼 바뀌면 안 된다
|
||||
|
||||
---
|
||||
|
||||
## 12. 구현 순서
|
||||
|
||||
### Slice 1. `/app` weekly review dock 추가
|
||||
|
||||
범위:
|
||||
|
||||
- teaser 노출 조건
|
||||
- teaser UI
|
||||
- `/stats` deep link
|
||||
|
||||
완료 기준:
|
||||
|
||||
- `/app`에서 review로 들어가는 primary path가 생긴다
|
||||
|
||||
### Slice 2. `/stats -> /app` return CTA 연결
|
||||
|
||||
범위:
|
||||
|
||||
- `/stats` 마지막 CTA
|
||||
- query/state handoff
|
||||
- `/app` review-aware state
|
||||
|
||||
완료 기준:
|
||||
|
||||
- review가 읽고 끝나는 페이지가 아니라 다음 세션으로 이어진다
|
||||
|
||||
### Slice 3. Pro personalized handoff
|
||||
|
||||
범위:
|
||||
|
||||
- best ritual carry-forward
|
||||
- review origin state 유지
|
||||
- CTA copy personalization
|
||||
|
||||
완료 기준:
|
||||
|
||||
- Pro가 더 자연스럽게 다음 세션으로 이어진다
|
||||
|
||||
### Slice 4. `/space` secondary teaser
|
||||
|
||||
범위:
|
||||
|
||||
- complete 이후 작은 review teaser
|
||||
- full review 강제 이동 금지
|
||||
|
||||
완료 기준:
|
||||
|
||||
- `/space`에서도 review가 존재하지만 execution을 방해하지 않는다
|
||||
|
||||
---
|
||||
|
||||
## 13. 데이터 / 인터페이스 제안
|
||||
|
||||
### `/app` teaser용 데이터
|
||||
|
||||
새 hook 또는 기존 `useFocusStats` 확장:
|
||||
|
||||
- `hasEnoughWeeklyData`
|
||||
- `weeklyTeaserLine`
|
||||
- `reviewHref`
|
||||
|
||||
### `/stats -> /app` handoff
|
||||
|
||||
추천 query:
|
||||
|
||||
- `review=weekly`
|
||||
- `entryPreset=forest-50-10`
|
||||
- `carryHint=start-smaller`
|
||||
|
||||
주의:
|
||||
|
||||
- query는 가볍게
|
||||
- 민감한 분석 전체를 싣지 않는다
|
||||
|
||||
### `/app` 복귀 상태
|
||||
|
||||
로컬 상태:
|
||||
|
||||
- `reviewSource`
|
||||
- `suggestedEntryPreset`
|
||||
- `carryForwardHint`
|
||||
|
||||
---
|
||||
|
||||
## 14. 완료 기준
|
||||
|
||||
- `/stats`의 primary entry가 `/app`에 생긴다
|
||||
- `/space`는 review의 secondary entry만 가진다
|
||||
- review를 본 뒤 사용자가 다시 `/app`으로 돌아와 다음 세션을 시작할 수 있다
|
||||
- review가 planner나 dashboard가 아니라 next-session ritual처럼 읽힌다
|
||||
- Free / Pro의 handoff 차이가 분명하다
|
||||
|
||||
---
|
||||
|
||||
## 15. 절대 피해야 할 방향
|
||||
|
||||
- `/space`에서 review로 강하게 끌어가는 것
|
||||
- review를 top nav의 메인 기능처럼 밀어올리는 것
|
||||
- `/stats`에서 바로 `/space` auto-start
|
||||
- review 결과로 goal을 자동 생성하는 것
|
||||
- review teaser가 `/app` hero보다 더 커 보이게 하는 것
|
||||
- planner/todo 회고처럼 보이게 만드는 것
|
||||
@@ -1,460 +0,0 @@
|
||||
# 18. Paused Session Re-entry Spec
|
||||
|
||||
Last Updated: 2026-03-15
|
||||
|
||||
이 문서는 VibeRoom에서 **진행 중인 세션 / 멈춘 세션 / 쉬는 시간**을 어떻게 다르게 취급할지,
|
||||
그리고 사용자가 `/app`에 들어왔을 때 어떤 경로로 다시 `/space`에 진입해야 하는지를 정의한다.
|
||||
|
||||
핵심 목적은 하나다.
|
||||
|
||||
> session state에 따라 `/app`과 `/space`의 역할을 정확히 나누고,
|
||||
> 사용자가 “지금 내가 어떤 상태인지”를 설명할 수 있는 premium UX를 만든다.
|
||||
|
||||
관련 문서:
|
||||
|
||||
- `./19_app_atmosphere_entry_spec.md`
|
||||
- `../space/10_refocus_system_spec.md`
|
||||
- `../space/11_away_return_recovery_spec.md`
|
||||
- `./15_app_stats_entry_flow_spec.md`
|
||||
- `../../product/16_product_alignment_audit_plan.md`
|
||||
- `../../product/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` 진입
|
||||
- no-session entry shell 노출
|
||||
|
||||
---
|
||||
|
||||
## 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가 되려면
|
||||
`멈춤`, `쉬기`, `복귀`, `새 시작`을 같은 것으로 취급하면 안 된다.
|
||||
|
||||
가장 중요한 원칙은 이거다.
|
||||
|
||||
> 이미 실행 중인 것은 바로 복귀시키고,
|
||||
> 의도적으로 멈춘 것은 다시 결정하게 하되,
|
||||
> 다시 하겠다고 결정한 뒤에는 한 번 더 묻지 않는다.
|
||||
22
docs/screens/app/README.md
Normal file
22
docs/screens/app/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# `/app` Docs
|
||||
|
||||
`/app` 화면 관련 문서를 모아둔 폴더다.
|
||||
|
||||
## current
|
||||
|
||||
지금 `/app` 작업에 직접 영향을 주는 source-of-truth 문서다.
|
||||
|
||||
- [19_app_atmosphere_entry_spec.md](./current/19_app_atmosphere_entry_spec.md)
|
||||
|
||||
## archive
|
||||
|
||||
이전 `/app` 방향이나 구현 완료 후 더 이상 기준 문서가 아닌 자료다.
|
||||
|
||||
- [08_app_reframe_strategy.md](./archive/08_app_reframe_strategy.md)
|
||||
|
||||
## 같이 볼 문서
|
||||
|
||||
`/app`은 화면 자체 문서 외에도 cross-screen flow 영향을 많이 받는다.
|
||||
|
||||
- [../../flows/current/15_app_stats_entry_flow_spec.md](../../flows/current/15_app_stats_entry_flow_spec.md)
|
||||
- [../../flows/current/18_paused_session_reentry_spec.md](../../flows/current/18_paused_session_reentry_spec.md)
|
||||
Reference in New Issue
Block a user