# Session Brief Last Updated: 2026-03-16 세션 시작 시 항상 읽는 초소형 스냅샷 문서. ## 고정 규칙 (요약) - 구현 범위는 UI 목업 + 더미 데이터 + 토스트로 제한한다. - `page.tsx`는 조합만 담당한다. - 비즈니스 로직은 `features/entities`로 이동한다. - 파일이 500줄 이상이면 분리한다. - 커밋은 주제별 1커밋, 한국어 Conventional Commit으로 작성한다. ## 현재 우선순위 1. `/app` Atmosphere Entry Shell 2. `Custom Duration Contract` 3. `Weekly Review Dock Reposition` 4. `Core Loop Alignment` browser audit ## 최근 세션 상태 - `/app` 전면 재설계 방향을 새 spec으로 고정했다. - no-session `/app`은 `goal + duration + atmosphere` 중심의 premium entry stage로 바뀐다. - microStep은 `/app`에서 제거하고, duration은 분 단위 직접 입력으로 전환한다. - scene + sound 조합 카드는 `Atmosphere`로 부르며, 첫 구현은 12개 dummy grid를 사용한다. - weekly review와 achieved-goal insight는 main stage가 아니라 quiet secondary dock로 유지한다. - `/app` Atmosphere Entry Shell 1차 구현을 반영했다. - no-session 상태는 더 이상 legacy `goal + microStep + fixed ritual` 화면을 쓰지 않는다. - 현재는 `goal 1개 + 예상 시간(분) + atmosphere 12개 grid + start CTA`로 들어간다. - 선택한 atmosphere는 `/app` 배경 preview와 `/space` start payload의 `scene/sound`에 같이 반영된다. - duration은 우선 가장 가까운 기본 리듬으로 매핑하는 임시 계약을 사용한다. - weekly review entry는 right-side quiet dock 위치로 옮겨 main CTA보다 낮은 위계를 유지한다. - `Paused Session Takeover Flow`를 구현했다. - `/app` paused gate에 `새 목표로 전환` 액션이 추가됐다. - takeover confirm sheet에서만 기존 paused session을 정리하고 새로 시작할 수 있다. - server `startSession()`은 더 이상 silent abandon을 하지 않고, current session이 남아 있으면 direct start를 거절한다. - takeover confirm 후에만 `abandon -> single-goal start` 순서로 넘어간다. - `/space` Refocus System 첫 slice를 구현했다. - pause 직후 바로 편집 시트가 아니라 작은 recovery prompt를 먼저 띄운다. - 여기서 `한 조각 다시 잡기`를 누르면 refocus tray로 들어간다. - paused 상태의 refocus는 `적용하고 이어가기`로 바로 resume까지 연결된다. - microStep 완료 후에는 checklist가 아니라 `다음 한 조각이 있나요?` prompt로만 이어진다. - recovery UI는 `paused / refocus / next-beat / complete` 중 하나만 열리도록 단일 overlay 상태로 묶였다. - `/space` goal complete 종료 경로를 복구했다. - `여기서 마무리하기`로 현재 목표를 다음 목표 입력 없이도 정상 완료 처리할 수 있다. - pause prompt의 `이대로 이어가기`는 단순 닫기가 아니라 실제 resume으로 연결된다. - `/space` goal complete / next beat를 덜 form스럽게 정리했다. - goal complete는 처음부터 input을 요구하지 않고, 선택지를 먼저 보여준 뒤 `다음 목표 이어가기`를 선택했을 때만 입력이 열린다. - next-beat prompt는 현재 goal 문맥을 함께 보여줘서 사용자가 어떤 목표를 이어가는지 잃지 않게 했다. - `/space` recovery tray material과 선택 위계를 같은 패밀리로 맞추기 시작했다. - pause / next-beat / complete tray가 공통 dark-glass shell을 공유한다. - inline 링크 중심이던 선택지를 quiet option row 구조로 바꿔, checklist보다 recovery decision처럼 읽히게 정리했다. - `Goal Complete`는 `다음 블록 이어가기 / 잠시 비우기 / 여기서 마무리하기`를 같은 tray 안의 선택 행으로 제시한다. - `Refocus`는 같은 shell 안에서 field / action 톤을 통일해 다른 tray와 같은 제품군처럼 보이게 맞추는 중이다. - `/space` Away / Return Recovery를 구현했다. - `visibilitychange`, `pagehide`, sleep/wake gap 기반 감지를 추가했다. - 짧은 탭 전환에는 반응하지 않도록 hidden threshold를 둬 오탐을 줄였다. - 돌아왔을 때 focus가 계속 running이면 `Return` tray가 `이어서 하기 / 한 조각 다시 잡기`를 제안한다. - 자리를 비운 사이 focus가 끝나 break phase가 되었으면 standard break 대신 `Return` tray가 먼저 뜬다. - 이 경우 `쉬기 이어가기 / 다음 목표 이어가기 / 한 조각 다시 잡기` 중 하나를 고를 수 있다. - `다음 목표 이어가기`는 goal complete next view로 바로 연결된다. - pause tray의 visual polish를 진행했다. - tray 폭과 max-height를 늘려 한국어 제목/설명 잘림을 줄였다. - title/body line-height와 spacing을 다시 잡아 임시 패널 느낌을 줄였다. - option row의 radius, padding, chevron 정렬을 보정해 더 차분한 recovery panel처럼 읽히게 했다. - `Pause / Break / Return`의 감정 톤 분리를 시작했다. - `Return(break)`은 focus 복귀 tray와 같은 재질을 쓰지 않고, 더 부드러운 emerald tint release tone으로 분리했다. - `Goal Complete`의 `잠시 비우기` 선택도 같은 release tone으로 연결했다. - timer HUD도 break phase에서는 더 가벼운 emerald 계열 material로 바뀌어 pause/focus와 다르게 읽히도록 정리 중이다. - `Pause / Break / Return`의 카피와 CTA 위계를 2차로 분리했다. - `Pause`는 `멈춘 이유`보다 `다시 시작할 한 줄`에 집중하는 recovery tone으로 다시 썼다. - `Return(focus)`는 `이어가기`, `Return(break)`는 `쉬기 이어가기 / 다음 블록 이어가기` 중심으로 문구를 분리했다. - `Goal Complete`는 `이어가기 / 잠시 비우기 / 마무리하기`의 선택 tray가 먼저 보이고, 다음 블록 입력은 이후 단계에서만 열리도록 더 선명해졌다. - `Pause / Break / Return`의 motion polish 1차를 반영했다. - `Pause`는 빠르게 다시 붙잡는 recovery reveal로, - `Return(focus)`는 재진입에 맞는 짧은 settle motion으로, - `Return(break)`와 `Goal Complete`는 더 느슨한 release/closure reveal로 분리했다. - `/space` active session에서는 goal closure 경로가 항상 남도록 정리했다. - `break`에서도 expanded goal card 안에 `이번 목표 완료`가 보인다. - `pause / return / next-beat`처럼 base card가 잠기는 overlay 안에는 low-emphasis `여기서 마무리하기`가 추가됐다. - 그래서 사용자는 recovery 상태에서도 `계속 / 다시 잡기 / 마무리` 중 하나를 바로 고를 수 있다. - `/space` 목표 카드를 collapsed / expanded 구조로 재설계했다. - idle에서는 goal 1줄만 남는 얇은 glass rail로 줄였다. - microStep과 `이번 목표 완료`는 expanded 상태에서만 드러난다. - recovery tray가 열리면 base card는 자동으로 collapsed 상태를 유지한다. - expanded rail은 outside click으로 접히지만, decision tray는 outside click으로 닫히지 않는다. - rail 클릭은 펼침/접힘만 담당하고, 수정은 expanded 상태의 `수정` 액션으로만 진입한다. - `/app`은 legacy single-goal gate에서 `goal + duration + atmosphere` 중심의 새 entry shell로 전환 중이다. - current session이 있으면 `Resume` gate가 우선 노출된다. - no-session 상태는 `goal 1개 + 예상 시간 + 선택된 atmosphere + 시작 CTA` 구조로 재설계 중이다. - `microStep`은 `/app`에서 제거하고 `/space` recovery/refocus에서만 다시 잡는다. - weekly review는 hero 아래 카드가 아니라 quiet secondary dock/entry로 유지한다. - manage/list 성격의 affordance는 메인 진입 경로에서 계속 배제한다. - `/space`는 execution-only surface로 정리됐다. - setup drawer에서 Daily Plan / Ritual Library 섹션을 제거했다. - goal, scene, sound, timer만 확인하고 focus HUD로 진입한다. - 목표 완료 후 다음 목표 즉시 실행 흐름이 backend contract와 연결됐다. - GoalCompleteSheet confirm 시 `advance-goal` endpoint를 사용한다. - 현재 세션 완료, linked plan item 완료, 새 current item 생성, 다음 세션 시작을 한 번에 처리한다. - 실패 시 시트를 닫지 않고 그대로 재시도할 수 있다. - `/stats`는 factual summary에서 `Weekly Review` 1차 구조로 올라갔다. - hero snapshot, start quality, recovery quality, completion quality, carry forward 구조를 사용한다. - 기존 `focus-summary` 응답은 review view model로 변환해서 쓴다. - recovery는 서버의 `pause 뒤 복귀` 집계를 사용하고, `away recovery`만 limited state로 남긴다. - `/app`에서 `/stats`로 들어가는 primary path 1차가 생겼다. - current session이 없을 때는 quiet review dock에서 `/stats`로 진입할 수 있다. - paused session 상태에서도 resume gate 안에 조용한 secondary review entry가 남는다. - review entry는 main start/resume CTA보다 항상 낮은 강조를 유지한다. - `/app` Resume 상태에서도 weekly review entry가 보이게 정리했다. - review primary entry가 active session 상태에서 사라지지 않도록, resume card 안에 조용한 secondary review link를 추가했다. - `/stats` 마지막 CTA의 `/app` return handoff가 연결됐다. - carry-forward CTA는 `/app?review=weekly&carryHint=...`로 돌아온다. - `/app`은 review-aware return hint를 먼저 보여주되, goal은 사용자가 직접 입력하게 유지한다. - `Weekly Review Entry Flow`의 Pro personalized handoff까지 연결됐다. - Pro에서는 `/stats` carry-forward에 추천 ritual을 함께 보여준다. - `/stats` 마지막 CTA와 `/app` teaser / return hint가 더 구체적인 handoff 톤으로 바뀐다. - `/space` complete 이후 secondary review teaser까지 연결됐다. - goal complete로 setup 상태로 돌아왔을 때만 setup drawer 아래에 작은 review teaser가 보인다. - full review 강제 이동 없이 `/stats`를 여는 secondary entry로만 동작한다. - 방금 끝낸 흐름을 반영한다고 과장하지 않는 카피로 정리했다. - `Weekly Review` recovery의 서버 연결이 들어갔다. - server `focus-summary` 응답에 `recovery`가 추가됐다. - 현재는 `pause 뒤 복귀`만 실집계이며, `자리 비움 뒤 복귀`는 partial note로 남아 있다. - paused session 재진입 정책을 별도 source of truth로 고정했다. - `running focus -> /space` - `running break -> /space` - `paused focus -> /app` - `/app`의 explicit continue 이후 `/space`에서는 다시 start를 묻지 않고 자동 resume해야 한다. - paused session 위의 새 시작은 direct가 아니라 takeover flow로만 허용한다. - `Paused Session Re-entry`의 Session Routing Contract를 1차 구현했다. - `/app`은 running session을 감지하면 hero를 보여주지 않고 즉시 `/space`로 보낸다. - `/space`는 paused session 상태에서 explicit handoff intent 없이 직접 열리면 `/app`으로 되돌린다. - `/app`의 `이어서 들어가기`는 다음 slice를 위해 `/space?resume=continue` handoff를 사용한다. - `Paused Resume Gate`와 `Auto-Resume Handoff`를 구현했다. - paused 상태의 `/app`은 `이어서 몰입하기`, `한 조각 다시 잡기`, quiet `주간 review 보기`를 함께 보여준다. - `이어서 몰입하기`는 `/space?resume=continue`로 들어간 뒤 자동 resume된다. - `한 조각 다시 잡기`는 `/space?resume=refocus`로 들어간 뒤 refocus tray를 바로 연다. - `Product Alignment Audit` 운영을 시작했다. - `docs/product/16_product_alignment_audit_plan.md`를 기준 문서로 추가했다. - `docs/product/17_product_alignment_findings.md`에 core loop의 P1/P2 mismatch를 수집하기 시작했다. - 다음 라운드는 route-flow matrix와 state contract matrix를 만드는 static audit이다. - 유료화 포지셔닝을 `Calm Session OS`로 재정의했다. - Free는 기본 집중 시작, Pro는 더 잘 이어가기라는 메시지로 정리했다. - old `Scene Packs / Sound Packs / Profiles` 중심 카피를 `Daily plan / Rituals / Weekly review` 구조로 교체했다. - `/app`은 더 이상 `/space` redirect가 아니다. - `FocusDashboardWidget`에서 goal only start와 plan-linked start를 모두 처리한다. - Free에서 두 번째 블록 추가 시도는 manage sheet 안에서 paywall로 진입한다. - 플랜 tier를 route 간에 공유하도록 정리했다. - `usePlanTier` localStorage store를 추가해 `/app`, `/space`, `/stats`가 같은 Free/Pro 상태를 본다. - Session OS mock 도메인을 추가했다. - `FocusPlanItem`, `SessionTemplate`, `SessionOutcome`, `WeeklyReview`, `AsyncCheckIn` 모델과 mock 데이터를 `entities/session`에 추가했다. - `/space` stage 배경을 overscan으로 보정했다. - background layer를 `-inset-8`로 확장해 pan 애니메이션 중 가장자리 빈틈 노출을 줄였다. - Gemini가 진행한 대형 파일 분리를 다시 점검했다. - `SpaceWorkspaceWidget`, `SpaceToolsDockWidget`, `admin/page.tsx`, `shared/i18n/ko.ts` 모두 500줄 기준 안으로 정리된 상태를 재확인했다. - 현재 주요 최대 파일은 `AdminDashboardView.tsx` 482줄, `useSpaceWorkspaceSelection.ts` 440줄 수준이다. - `/admin` 분리 과정의 placeholder 회귀를 복구했다. - 로그인 후 `Dashboard is under construction`만 보이던 상태를 제거했다. - 실제 scene/sound 업로드 폼을 `AdminDashboardView`로 복원해 `AdminConsoleWidget`은 조합만 담당하도록 되돌렸다. - 인증 전역 저장소 위치를 정리했다. - `src/store/useAuthStore.ts`를 제거했다. - 인증 상태 저장소를 `entities/auth/model/useAuthStore.ts`로 이동해 feature가 루트 store를 직접 참조하지 않도록 정리했다. - `/space` 배경 asset 해석을 보강했다. - media manifest scene key를 alias-aware 하게 정규화해 `green-forest`와 `forest`를 같은 scene asset으로 읽는다. - scene/sound asset에 `source(fallback|remote)` 메타를 추가해 remote asset 사용 여부를 코드에서 바로 식별할 수 있다. - remote manifest load 실패와 scene fallback 사용 시 `/space`에서 진단 로그를 남기도록 보강했다. - Focus 피드백 채널을 상단 중앙 1곳으로 통합했다. - HUD 내부 status line 제거 - Notes/Goal/잠금 피드백이 동일 위치 토스트로 표시 - 기본 기능 잠금을 해소했다. - Time `90/20`을 Free로 개방 - 기본 Sound 잠금 제거 - Pro 잠금 구조를 Session OS 중심으로 재구성했다. - `Daily Focus Plan / Rituals / Weekly Review` 요약 카드 추가 - 기본 Scene/Time/Sound는 잠금 없이 선택 가능 - Paywall 시트는 잠금 카드 클릭에서만 열리도록 바꿨다. - Plan Pill(FREE) 클릭은 즉시 결제창 오픈 대신 상태 안내만 노출 - Paywall 카피를 3개 가치 포인트 + 2개 CTA로 간결화 - Focus-First 구조로 전환했다. - Quick Controls의 모드 전환 토글(기본/몰입)을 제거했다. - HUD는 외부 모드 상태 없이 기본 몰입 톤으로 유지한다. - 컨트롤 노출은 패널 열림 상태에서만 보이도록 단순화했다. - Quick Controls 패널 내부에 표시 정책 옵션을 추가했다. - 옵션: `컨트롤 자동 숨김` - ON 상태에서 Control Center가 8초 무입력이면 자동 닫힘 처리 - `/space`에 Scene 추천 자동 적용 규칙을 도입했다. - Room 데이터에 `recommendedSoundPresetId`, `recommendedTimerPresetId`를 추가했다. - 초기 진입/Scene 변경 시 override가 없는 항목만 추천값으로 자동 반영된다. - `/space`에 override 상태(`sound`, `timer`)를 추가했다. - 사용자가 직접 고른 사운드/타이머는 Scene 변경에도 자동 덮어쓰지 않는다. - `추천으로 되돌리기(더미)` 액션으로 override 초기화 + 추천값 즉시 복원이 가능하다. - Control Center를 Scene/Time 중심으로 단순화했다. - Sound/Preset Packs 섹션 제거 - 추천 정보 1줄 + `추천으로 되돌리기`만 유지 - 우하단 Sound Quick 선택 경로를 `onQuickSoundSelect`로 분리해 override.sound 규칙을 명시했다. - `/space` 선택 상태 로컬 저장/복원을 추가했다. - 저장: `sceneId`, `timerPresetId`, `soundPresetId`, `goal`, `override(sound/timer)` - 복원 우선순위: 쿼리 파라미터 > 저장 상태 > Scene 추천 - `/space` 진입 시 Resume CTA를 추가했다. - 저장된 목표가 있고 쿼리 오버라이드가 없으면 `지난 한 조각 이어서`를 1회 노출 - `이어서 시작`은 즉시 Focus 진입, `새로 시작`은 목표를 비운 새 세션으로 전환 - 세션 복구용 문서/템플릿/스크립트가 준비되어 있다. - `ops/workFlow.md`는 토큰 절약 모드를 사용한다. - `/space` 하단 사운드 바를 제거하고 오른쪽 `🎧 Sound` 시트로 이동했다. - `/space` 헤더 프레임을 축소하고 HUD를 하단 safe-area 기준으로 더 밀착시켰다. - 상단 우측 나가기 액션을 클릭형에서 1초 롱프레스형으로 전환했다. - 0.05초에 진행률 20%까지 빠르게 상승하는 가속 진행을 적용했다. - 몰입 OFF는 bar, 몰입 ON은 ring 형태로 진행률을 표시한다. - 롱프레스 bar 진행 표시를 CSS keyframes 기반으로 교체해 즉시 가시성을 개선했다. - 완료 후 fill이 0으로 역방향 축소되는 현상을 제거했다. - fill 끝단은 직선 형태로 정리했다. - 30초 복귀 액션을 감성 라운지 톤으로 리브랜딩했다. - 버튼 라벨을 `숨 고르기 30초`로 변경했다. - HUD 모드 라벨은 진입 시 `BREATHE`로 표시된다. - 클릭 시 저자극 안내 문구를 HUD 미니 안내 + 토스트로 노출한다. - `/landing` 이후 앱 플로우 배경을 밝은 톤으로 조정했다. - `/app` 허브/룸 카드 오버레이를 완화해 배경 노출을 늘렸다. - `/space` 오버레이/비네팅 강도를 낮춰 전체 명도를 올렸다. - `/stats`, `/settings`는 라이트 팔레트 기반 패널로 전환했다. - `/app` 룸 카드 hydration 에러를 수정했다. - `RoomPreviewCard`의 중첩 `