# 90. Current State Last Updated: 2026-03-12 ## DONE - 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를 허용 - block CRUD는 메인 화면에서 제거하고 `블록 정리` manage sheet 안으로 내렸다 - `FocusPlan` current item은 hero prefill로 이어지고, preview row는 최대 2개까지만 보조적으로 노출 - Free는 1개, Pro는 최대 5개 블록까지 관리하도록 프론트 제한을 유지 - `/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를 차지한다 - `start`를 `plan persistence`와 분리해 goal only 쿼리로도 `/space` 진입 가능하게 정리했다 - Free에서 두 번째 블록 추가 시도 시 manage sheet 내부에서 paywall로 진입 - 플랜 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 정착: - 기존 API summary/trend 유지 - 해석형 insight/quiet accountability preview를 제거하고 factual card만 유지 - 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`의 중첩 `