# 90. Current State Last Updated: 2026-03-15 ## DONE - `/app` single-goal commitment gate 재구성: - 2-step `goal -> ritual` flow 제거 - current session이 있으면 `Resume` UI를 우선 노출하고, `/space`로 바로 이어가기만 제안하되 review entry는 조용한 secondary link로 유지 - current session이 없으면 `goal 1개 + optional microStep 1개 + primary CTA`만 남긴 direct start 구조로 단순화 - `환경 세팅`, `블록 정리`, scene/sound/timer 선택을 메인 진입 경로에서 제거 - suggestion chip은 planner가 아니라 입력 마찰을 줄이는 용도로만 유지 - 시작 시에는 기본 ritual(`forest · 50/10 · forest-birds`)로 세션을 열고, 세부 조정은 `/space`에서 하도록 역할을 분리 - `/app`이 planner home이 아니라 commitment gate라는 역할을 문서와 구현 모두에서 다시 고정 - `/space` Refocus System slice 1 구현: - HUD recovery layer를 `paused / refocus / next-beat / complete` 단일 overlay 상태로 정리 - pause 직후 바로 편집 시트를 열지 않고, 작은 recovery prompt를 먼저 노출 - `한 조각 다시 잡기`로 refocus에 들어가고, paused 상태에서는 `적용하고 이어가기`로 바로 resume 연결 - microStep 완료 후 `다음 한 조각이 있나요?` next-beat prompt로만 이어지게 정리 - 한 번에 하나의 recovery tray만 열리도록 hierarchy를 고정 - `/space` Refocus System slice 2 구현: - pause prompt의 `이대로 이어가기`가 실제 resume 동작으로 연결 - goal complete tray에 `여기서 마무리하기` 경로 추가 - 현재 세션을 다음 목표 입력 없이도 정상 완료 처리할 수 있게 연결 - goal complete / rest / next-goal의 세 분기가 UI와 동작 모두에서 분리됨 - `/space` Refocus System slice 3 구현: - goal complete tray가 초기부터 input form을 강요하지 않도록 progressive disclosure 구조로 변경 - `여기서 마무리하기 / 잠시 비우기 / 다음 목표 이어가기`를 먼저 제안하고, 다음 목표 입력은 선택 시에만 펼쳐지게 정리 - next-beat prompt에 현재 goal 문맥을 함께 보여주도록 보강 - `/space` Refocus System slice 4 구현: - pause / next-beat / complete / refocus tray의 glass material, hairline, spacing을 공통 규칙으로 정리 - 선택 액션을 단순 inline 링크에서 quiet option row로 바꿔 recovery decision hierarchy를 선명하게 만듦 - `goal complete`의 세 분기를 같은 tray 안의 선택 행으로 통합해 planner/form 느낌을 약화 - `refocus` form field와 footer action 톤을 다른 recovery tray와 같은 제품군으로 맞춤 - `/space` Away / Return Recovery slice 구현: - `visibilitychange`, `pagehide`, sleep/wake gap 기반 AwayCandidate 감지 추가 - 짧은 탭 전환에는 반응하지 않도록 hidden threshold를 둠 - 돌아왔을 때 focus가 아직 running이면 `Return` tray에서 `이어서 하기 / 한 조각 다시 잡기`를 제안 - 자리를 비운 사이 focus가 끝나 break phase가 되었으면 standard break 대신 `Return` tray를 먼저 띄움 - 이 경우 `쉬기 이어가기 / 다음 목표 이어가기 / 한 조각 다시 잡기`를 선택할 수 있음 - `다음 목표 이어가기`는 `Goal Complete` next view로 바로 연결됨 - `/space` Pause tray premium polish: - tray 폭과 열림 높이를 키워 긴 한국어 카피가 잘리지 않게 조정 - eyebrow / title / body의 typography hierarchy와 line-height를 재정렬 - option row spacing, radius, chevron 위치를 보정해 급조된 버튼 묶음 느낌을 완화 - `/space` Pause / Break / Return tone 분리 1차 구현: - `Return(focus)`와 `Return(break)`가 같은 tray처럼 보이지 않도록 break tray에 emerald tint release tone 도입 - `Goal Complete`의 `잠시 비우기` 선택도 같은 break 계열 material로 연결 - timer HUD는 break phase에서 더 가벼운 emerald 계열 glass로 보정해 focus/pause와 구분되게 조정 - `/space` Pause / Break / Return copy + interaction polish: - `Pause`는 `멈춘 이유` 대신 `다시 시작할 한 줄`을 중심으로 카피를 다시 정리 - `Return(focus)`는 `멈춘 자리에서 이어가기`, `Return(break)`는 `쉬기 이어가기 / 다음 블록 이어가기` 중심으로 재서술 - `Goal Complete`는 `다음 블록 이어가기 / 잠시 비우기 / 여기서 마무리하기` 순의 선택 tray를 먼저 보여주고, 다음 블록 입력은 이후 단계에서만 열리게 정리 - choice/next view의 헤더와 설명도 각각 다른 감정 상태에 맞춰 분리 - `/space` Pause / Break / Return motion polish 1차 구현: - `Pause` tray는 빠르게 다시 붙잡는 recovery reveal로 조정 - `Return(focus)`는 짧은 re-entry settle motion으로, `Return(break)`는 더 느슨한 release reveal로 분리 - `Goal Complete`도 같은 recovery family 안에서 가장 느린 closure motion을 가지도록 조정 - `/space` intent HUD collapsed / expanded 재설계: - 상시 큰 goal 카드 대신 idle에서는 goal 1줄만 남는 collapsed glass rail 구조로 변경 - hover / focus / rail tap에서만 expanded card로 열리며, 이때만 microStep과 `이번 목표 완료` 액션이 노출됨 - recovery tray(`pause / return / next-beat / complete / refocus`)가 열릴 때는 base card가 강제로 collapsed 상태를 유지하도록 정리 - expanded rail은 outside click으로 접히지만, recovery tray는 outside click으로 닫히지 않고 명시적 액션으로만 닫힘 - rail 클릭은 expand/collapse만 담당하고, refocus는 expanded 상태의 `수정` 액션으로만 진입 - Focus Entry Surface / Execution Surface 재정의: - `/app`을 planning home이 아니라 hero-first focus entry surface로 재구성 - 상단 카피를 `Planning Home` 톤에서 `지금 시작할 첫 블록` 진입 톤으로 교체 - 메인 hero에 one-line goal input + 단일 primary CTA `지금 시작`만 남기고, 첫 진입의 주 행동을 고정 - empty state에서는 starter draft를 자동 주입하지 않고 placeholder 입력으로 시작한다 - suggestion chip으로 draft를 빠르게 교체할 수 있게 하고, 직접 타이핑 시에는 ad-hoc start를 허용 - 이후 `/app`은 current session이 있으면 `Resume`, 없으면 single-goal direct start만 남기는 commitment gate로 더 줄였다 - block CRUD, preview row, list-first 구조는 메인 진입 경로에서 제거했다 - `/space`는 planning overview 없이 goal/scene/sound/timer + HUD 실행 화면으로 정리 - focus-plan / focus-session 서버 계약 연결: - `GET /api/v1/focus-plan/today` - `POST /api/v1/focus-plan/items` - `PATCH /api/v1/focus-plan/items/:id` - `DELETE /api/v1/focus-plan/items/:id` - `POST /api/v1/focus-plan/items/:id/complete` - `POST /api/v1/focus-sessions/current/advance-goal` - frontend에서 plan item id와 today plan 응답을 backend contract 기준으로 정규화 - `GET /today`는 current 이후 pending item 전체를 `nextItems`로 반환 - 목표 완료 후 다음 목표 즉시 실행 흐름 구현: - GoalCompleteSheet에서 다음 목표를 입력하면 현재 세션 완료 + 새 planning item 생성 + 다음 세션 즉시 시작 - 같은 scene / sound / timer를 유지한 채 `/space` focus 화면에서 그대로 이어감 - 실패 시 시트를 닫지 않고 HUD 토스트로 에러만 노출 - `/stats` factual summary 정리: - weekly insight / quiet accountability mock 제거 - today / last7Days / trend만 남기고 factual card 구조로 단순화 - Calm Session OS 유료화 축 구현: - Free는 기본 시작, Pro는 더 잘 이어가기를 파는 구조로 재정의 - old `Scene Packs / Sound Packs / Profiles` 중심 copy를 `Daily Focus Plan / Rituals / Weekly Review` 중심으로 교체 - `/app` route를 Session OS focus entry surface로 복구: - `/app` route가 `/space` redirect 대신 `FocusDashboardWidget`을 렌더링 - current/next summary card와 list-first 구조를 제거하고, entry hero가 above-the-fold를 차지한다 - 현재는 current session이 있으면 resume, 없으면 `goal + microStep + start`만 제안하는 single-goal entry로 정리됐다 - scene/sound/timer는 기본 ritual로 시작하고, 세부 조정은 `/space`에서 담당한다 - 플랜 tier 공유 store 추가: - `entities/plan/model/usePlanTier.ts` 추가 - localStorage 기반 Free/Pro 상태를 `/app`, `/space`, `/stats`, dock paywall에서 공통 사용 - Session OS 도메인 mock 추가: - `FocusPlanItem` - `SessionTemplate` - `SessionOutcome` - `WeeklyReview` - `AsyncCheckIn` - `entities/session/model/focusSystem.ts`에 mock/헬퍼 집약 - `/space` planning overview 제거: - setup drawer에서 Daily Plan / Ritual Library 진입 섹션 제거 - `/app`에서 넘긴 goal + `planItemId`를 받아 execution-only surface로 집중 - `/stats` factual summary 정착: - factual card 반복 중심의 구조를 해체하고 `Weekly Review` 1차 IA로 전환 - `snapshot + start quality + recovery quality + completion quality + carry forward` 구조를 반영 - 기존 `focus-summary` 응답을 주간 review view model로 변환해서 사용 - recovery는 서버의 `pause 뒤 복귀` 집계를 사용하고, `자리 비움 뒤 복귀`만 limited note로 남긴다 - `/app -> /stats` primary entry의 1차 연결: - current session이 없고 최근 7일 데이터가 충분할 때 `/app` hero 아래에 low-emphasis `Weekly Review` teaser를 노출한다 - teaser는 `/stats`로 연결되며, hero CTA보다 한 단계 아래 시각 우선순위를 유지한다 - `/stats -> /app` handoff의 2차 연결: - `/stats` 마지막 CTA는 `/app?review=weekly&carryHint=...&entryPreset=forest-50-10`으로 연결된다 - `/app`은 이 query를 받아 hero 위에 review-aware return hint를 노출한다 - goal과 microStep은 자동 입력하지 않고, 방향만 가볍게 제안한다 - Pro personalized handoff 3차 연결: - Pro에서는 `/stats` carry-forward 섹션에 추천 ritual을 함께 보여준다 - `/stats` 마지막 CTA 카피가 generic start가 아니라 `가장 잘 맞은 ritual로 /app 돌아가기`로 바뀐다 - `/app` teaser와 review return hint도 Pro에서 더 구체적인 next-session handoff 톤으로 표시된다 - `/space` secondary review teaser 4차 연결: - goal complete로 setup 상태로 돌아왔을 때만 setup drawer 아래에 low-emphasis review teaser가 보인다 - teaser는 `주간 review 보기`로 `/stats`를 열고, 방금 끝낸 흐름 반영을 과장하지 않는 카피만 사용한다 - 다시 시작하거나 dismiss하면 사라지며, live execution 중에는 보이지 않는다 - `Weekly Review` recovery의 서버 연결: - server `focus-summary` 응답에 `recovery`가 추가됐다 - `pause_count / resume_count` 기반 `pause 뒤 복귀`를 실제 수치로 보여준다 - 현재는 `away recovery` 이벤트 스키마가 없어 partial/limited 상태로 남긴다 - paywall / plan / landing 메시지 재정렬: - paywall 가치 포인트를 multi-queue, rituals, weekly review 중심으로 재작성 - landing pricing에서 구현되지 않은 1:1 매칭 / 오픈 코워킹 / 팀 대시보드를 메인 판매 포인트에서 제거 - Teams는 후순위 준비중 톤으로 약화 - Gemini 분리본 재점검: - `SpaceWorkspaceWidget`, `SpaceToolsDockWidget`, `admin/page.tsx`, `shared/i18n/ko.ts` 분리 상태를 다시 확인 - 현재 기준 500줄 초과 파일 없음 - 최대 파일은 `src/widgets/admin-console/ui/AdminDashboardView.tsx` 482줄 - `/admin` 업로드 콘솔 회귀 복구: - widget 분리 이후 로그인 후 placeholder만 보이던 상태 제거 - `AdminConsoleWidget`은 조합만 담당하고, 실제 scene/sound 업로드 UI는 `AdminDashboardView`로 분리 복원 - 인증 전역 상태 위치 정리: - `src/store/useAuthStore.ts` 제거 - `entities/auth/model/useAuthStore.ts`로 이동해 auth feature가 루트 store를 직접 참조하지 않도록 정리 - auth 타입 참조 정리: - `features/admin/api/adminApi.ts`가 `features/auth/types` 대신 `entities/auth`를 직접 사용 - `features/auth/types/index.ts`는 중복 선언을 제거하고 `entities/auth` 재export만 담당 - `/space` stage 배경 overscan 보정: - pan 애니메이션 중 가장자리 빈틈이 드러나지 않도록 stage background layer를 `-inset-8`로 확장 - `/space` 배경 asset 해석 안정화: - media manifest scene key를 scene alias까지 정규화해 `green-forest`와 `forest`를 동일 asset으로 해석 - scene/sound asset에 `source(fallback|remote)` 메타를 추가해 실제 fallback 사용 여부를 구분 가능하게 정리 - remote manifest load 실패 시 error 상태를 노출하고, `/space`에서 manifest 실패/scene fallback 사용을 진단 로그로 남기도록 보강 - Focus 피드백 채널 단일화: - HUD 내부 status line을 제거하고 상단 중앙 고정 토스트로 통합 - Notes 저장/Undo, Goal 전환, 잠금 안내 피드백이 동일 위치에서 노출 - Free 코어 루프 개방: - Quick Controls Time의 `90/20` 잠금을 제거 - 기본 Sound 잠금 제거로 Free에서도 기본 3~6 프리셋 선택 가능 - Pro 가치 재배치: - Pro 잠금 대상을 `Daily Focus Plan / Rituals / Weekly Review`로 재정의 - 기본 Scene/Time/Sound는 잠금 없이 선택 중심으로 정리 - Control Center UI 재구성: - Scene/Time/Sound 중심 구조 유지 - 추천 조합을 정보 1줄로 축소(비인터랙션) - 하단에 Session OS 요약 카드(작은 🔒 배지) 추가 - Paywall 의도 기반 트리거 적용: - 잠금 카드 클릭 시에만 Paywall Sheet 오픈 - Plan Pill(NORMAL) 클릭은 즉시 결제창 대신 상태 안내만 표시 - Paywall Sheet를 3개 가치 포인트 + 2개 CTA로 간결화 - Focus-First 전환: - Quick Controls의 `기본/몰입` 토글 제거 - HUD를 외부 모드 상태 없이 기본 몰입 톤으로 고정 - 컨트롤 노출은 패널 열림 상태에서만 보이도록 단순화 - 표시 정책 옵션 추가: - Quick Controls 패널 하단에 `컨트롤 자동 숨김` 옵션 추가 - 옵션 ON 상태에서 Control Center 8초 무입력 시 자동 닫힘 처리 - Quick Controls 모드 전환 UI 재정렬: - 헤더에서 모드 토글 UI를 제거하고 `Plan + 닫기`만 유지 - 패널 바디 첫 섹션에 `기본/몰입` segmented pill 배치 - 모드 설명 1줄(기본: 모든 컨트롤 표시, 몰입: 필수만 남기고 숨김) 추가 - 모드 상태를 workspace -> tools-dock -> focus-hud 경로로 연결해 HUD 톤 반영 유지 - `/space` Scene 기반 자동 추천 적용: - `RoomTheme`에 `recommendedSoundPresetId`, `recommendedTimerPresetId` 필드 추가 - 첫 진입/시작 시 Scene 추천 타이머/사운드가 자동 반영되도록 초기화 로직 정리 - Scene 변경 시 `override.sound/timer`가 `false`인 항목만 자동 동기화 - `/space` 사용자 override 존중 규칙 도입: - `override.sound`, `override.timer` UI 상태 추가 - 사용자가 직접 고른 항목은 이후 Scene 변경에도 자동 덮어쓰기되지 않도록 반영 - `추천으로 되돌리기(더미)` 액션으로 override 초기화 + 추천값 즉시 복원 지원 - `Control Center`를 Scene/Time 중심으로 단순화: - Sound/Preset Packs 섹션 제거 - 비인터랙션 추천 정보 1줄(`추천: 사운드 · 타이머`) 추가 - 하단 tertiary 액션 `추천으로 되돌리기` 추가 - 우하단 Sound Quick 경로를 override 적용의 명시적 경로로 분리: - `onQuickSoundSelect` 콜백으로 연결해 `override.sound` 규칙을 코드 레벨에서 고정 - 세션 상태 더미 저장/복원 추가: - `sceneId`, `timerPresetId`, `soundPresetId`, `goal`, `override(sound/timer)`를 localStorage에 저장 - 복원 우선순위: 쿼리 파라미터 > 저장 상태 > Scene 추천 - `/space` 진입 Resume CTA 추가: - 저장된 목표가 있고 쿼리 오버라이드가 없을 때 `지난 한 조각 이어서` 블록 1회 노출 - `이어서 시작`: 저장 목표로 즉시 Focus 진입 - `새로 시작`: 목표를 비워 새 세션 입력 흐름으로 전환 - 세션 복구 운영 문서 추가: - `docs/06_commit_convention.md` - `docs/07_session_recovery.md` - 워크플로우 토큰 절약 모드 추가: - `docs/context_core.md` 신설 - `docs/workFlow.md`를 기본 3문서 + 조건부 로드로 변경 - 워크플로우 기본 로드를 2파일로 축소: - `docs/work.md` - `docs/session_brief.md` - 복구 스크립트 추가: - `scripts/session/recover-context.sh` - `npm run session:recover` 명령 추가 - `/app` Start Ritual에서 절차감을 높이던 `건너뛰기` 제거 - `/app`에서 `다시 시작(30초)` 제거 - `/space` HUD에 `features/restart-30s` 기반 `↻ 다시 시작 + 30초 배지` 추가 - `/space` 하단 사운드 프리셋 바 제거, 오른쪽 `🎧 Sound` 시트로 이동 - `features/sound-preset` + `widgets/sound-sheet` 추가 - `features/immersion-mode` 추가, Quick 시트에서 몰입 모드 토글 연결 - `/space` 상단 헤더 크롬 최소화: - 헤더 프레임(border/강한 배경) 제거 - 패딩 축소로 배경 노출 증가 - 타이머 HUD 하단 위치를 safe-area 기반 최소 여백으로 조정 - 몰입 모드 ON 시 상단 액션을 `나가기` 버튼으로 전환 - 클릭 시 토스트 `나가기(더미)` 노출 + 몰입 모드 OFF - `/space` 상단 우측 나가기 액션을 롱프레스(1초)로 변경 - 0.05초에 진행률 20%까지 빠르게 상승 - 1초 유지 시 `나가기(더미)` 토스트 + 몰입 모드 OFF - 몰입 OFF: 좌→우 fill(bar), 몰입 ON: 원형 ring 진행 표시 - 롱프레스 bar 진행 표시 버그 수정: - 눌렀을 때 즉시 fill이 보이도록 CSS keyframes 기반으로 교체 - 완료 후 fill이 0으로 역방향 축소되는 현상 제거(짧은 유지 후 언마운트) - fill 끝단을 직선 형태로 정리(rounded 캡 제거) - 30초 복귀 액션 카피를 감성 라운지 톤으로 리브랜딩: - 버튼 라벨: `숨 고르기 30초` - 진입 시 HUD 모드 라벨: `BREATHE` - 클릭 시 저자극 안내 문구 노출(2초 이내 미니 안내 + 토스트) - `/landing` 이후 앱 플로우 배경 톤을 밝은 무드로 조정: - `/app` 허브 배경 오버레이를 밝게 조정하고 룸 카드 어두운 마스크 강도 완화 - `/space` 배경 오버레이/비네팅 강도를 낮춰 배경 노출 증가 - `/stats`, `/settings` 배경/패널을 라이트 팔레트로 전환 - `/app` 룸 카드 hydration 에러 수정: - `RoomPreviewCard`의 중첩 `