595 Commits

Author SHA1 Message Date
songyc macbook
5d64719187 docs(marketing): 1.1 스토어 메타데이터 확정값 반영 — 앱 이름·부제목·키워드·프로모션 텍스트
- app-name-subtitle.txt 신설(ko/en/ja 이름·부제목, 설치 이름은 불변 명시)
- keywords.txt: 이름·부제목과 중복되는 토큰 제거 + 보완 항목 추가(전 로케일 100자 이내)
- promotional-text.txt: 브랜드 멘트+기능 요약 2줄 구성으로 교체(전 로케일 170자 이내)
- 모든 필드 글자 수 검증 완료, CLAUDE.md 현재 상태 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-30 21:31:00 +09:00
songyc macbook
2fb7b3c75a feat(settings): '짧은 기록 무시'를 iCloud 키-값 저장소로 전 기기 동기화 (1.1)
- 검사가 종료 실행 기기 기준이라 기기별 값이면 교차 사용(아이패드 시작→아이폰 종료)에서
  결과가 갈리던 문제 해소 — 값 자체를 모든 기기에서 통일
- SettingsCloudSync: 시작 시 iCloud 값 채택(없으면 로컬 값 시드), 외부 변경·포그라운드 복귀 때
  pull, 설정 변경 때 push(동일 값 가드). App Group 저장은 유지(위젯·인텐트 읽기 경로 무변경),
  CloudKit 스키마·프리미엄 토글과 무관 — ubiquity-kvstore 엔타이틀먼트만 추가
- 설정: 측정 섹션을 나눠 '짧은 기록 무시' 바로 밑에 전 기기 공통 안내 푸터,
  '장시간 측정 알림'은 기기별 유지 명시. 도움말도 갱신, en/ja 번역(missing 0·stale 0, 실렌더 확인)
- whats-new-1.1 3개 언어에 항목 추가, CLAUDE.md §6.8 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-30 02:03:29 +09:00
songyc macbook
183b0a6fa0 chore(marketing): 일기 달력 스크린샷 재촬영(기본 표시 설정 아이콘 반영) + 1.1 새로운 기능 문구 추가
- 아이패드 02-diary-calendar ko/en/ja 원본·합성판 재촬영 — 툴바의 새 '기본 표시 설정'
  아이콘 포함, 상태바 9:41·7월 29일로 기존 세트와 동일(시뮬레이터 TZ 부팅 주입: America/Phoenix)
- whats-new-1.1.txt 3개 언어에 일기 기본 표시 설정 항목 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-30 01:22:43 +09:00
songyc macbook
828eb21787 feat(diary): 날짜 화면 '기본 표시 설정' — 캘린더·목표·타임테이블 행동의 전 날짜 기본값 (1.1)
- 달력 툴바 '기본 표시 설정'(DiaryDefaultsSheet): 캘린더 일정 기본 모드(표시 안 함/모든 캘린더/
  선택한 캘린더만) + 목표·행동 기본 숨김 토글. 기기 로컬 standard(diary.default*) 저장
- 날짜별 재정의: 기존 동기화 배열에 마커(#override)만 추가 — 스키마 무변경, 구버전(1.0/1.1)은
  마커를 무시해 표시 동일, 1.1 이전 날짜별 선택(마커 없는 목록)은 재정의로 계속 존중
- 기본값은 소급 적용(재정의 없는 모든 날짜가 현재 기본값을 따름), 각 필터 시트에
  '기본값으로 되돌리기' 추가. 행동 필터 onChange는 효과값과 같으면 저장 안 함(기본값 굳음 방지)
- 효과 계산 단일 지점(DiaryDefaults.effective*)을 화면·PDF/이미지 내보내기·캘린더 블록이 공유 —
  기본값 날짜·재정의 날짜 모두 화면=내보내기 일치(내보내기 실검증 완료)
- 검증: 요약 카드 목표 숨김 배지·타임테이블 행동 숨김·캘린더 '모든 캘린더' 자동 표시(점선)·
  목표 필터 효과 반영 스크린샷 + 이미지 내보내기 왕복 + 자가 테스트 회귀 ALL PASS
- 도움말(일정·필터 주제) 확장 + en/ja 14키 번역(missing 0, ja 실렌더 확인), CLAUDE.md §6.7·§14
- DEBUG: -diaryShowDefaults(시트), -diaryDefaultsSeed(기본값 주입 검증)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-30 01:06:44 +09:00
songyc macbook
2dc81fe0e5 feat: 버전 1.1 — 맥 일기 개방 + CSV 가져오기(프리미엄) + 스크린샷 전면 개편
맥 일기 (§6.7):
- 사이드바에 일기 탭 개방 (AppTab.sidebarCases 맥 필터 제거)
- 맥 노트 도구줄: 텍스트 우선 가로 스크롤 + '그리기' 토글(마우스·트랙패드 필기, drawingPolicy anyInput)
- 그리기↔배치 상호 배타, 일기 잠금 설정 맥 노출 — 아이패드 경로는 코드 불변(회귀 차단)

CSV 가져오기 (§6.8·프리미엄):
- IOS/Core/CSVImport.swift: RFC4180 파서·데이터 행 모양 판별(언어 무관)·계획/반영 분리·초 단위 멱등 중복 처리
- 행동 연결: uuid 우선 → 이름+방식 폴백 → 새로 생성(uuid 보존), '측정 중' 행 제외, 추가 전용
- DataImportView: 파일 선택(복수) → 미리 보기 → 확인 → 저장 1회. 무료 한도 우회 방지 위해 프리미엄 게이트
- 자가 테스트 -csvImportTest 20건 ALL PASS, 진행률 자가 테스트 회귀 ALL PASS

문서·현지화·버전:
- 도움말(일기 맥·CSV 복원)·프리미엄 기능 행·설정 문구 갱신, en/ja 42키 번역·stale 10키 정리 (missing 0)
- CLAUDE.md §1/§6/§6.7/§6.8/§8/§14, Marketing 설명 ko/en/ja·whats-new-1.1, MARKETING_VERSION 1.1(4타깃)

스크린샷 전면 재제작 (ko/en/ja):
- 아이폰 10장·아이패드 10장(신규: 기록 목록/주간 타임테이블/일기 양식/다크/목표)·워치 합성 1장
- 시간대 정합: SIMCTL_CHILD_TZ 부팅 주입(Asia/Bangkok) + -marketingTZ 프로브 검증 절차 확립(README)
- frame_screenshots.swift: 문구 5종 추가·일기/동기화 문구 맥 반영·renderWatch 합성 추가 (총 63장)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-29 11:30:25 +09:00
songyc macbook
a3a83fbf18 feat(marketing): App Store 스크린샷 세트 확장 — 아이폰 8장·아이패드 7장 × ko/en/ja
- 아이폰 추가 4장: 05 위젯 모아 보기(실렌더) / 06 글래스 버블 메뉴 / 07 iCloud 동기화(합성) / 08 다크 모드
- 아이패드 추가 3장: 05 주간 타임테이블(벌크 시드로 꽉 찬 지난주) / 06 위젯 모아 보기 / 07 iCloud 동기화(합성)
- DEBUG 전용 촬영 도구: -widgetPreview marketing(위젯 실렌더 판), -historyDaysAgo(과거 주 표시) — 출시 빌드 무영향
- frame_screenshots.swift: 신규 문구 5종 + renderSync(아이폰·아이패드 01-main 듀오 합성, 동기화 배지)
- 촬영 시각 정합: SIMCTL_CHILD_TZ로 앱 내 시각을 상태바 9:41대에 맞춤 (README에 절차 기록)
- 다음 버전 제출 때 ASC 각 언어 스크린샷 란에 추가 업로드 필요 (README 체크리스트에 명시)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-29 03:05:33 +09:00
songyc macbook
05071342dc docs: iCloud 프로덕션 동기화 실사용 확인 완료 — 출시 후 남은 확인 항목 해소
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 15:13:33 +09:00
songyc macbook
ccc58afac2 docs: 버전 1.0 App Store 출시 완료 반영 — 유지보수 모드 전환
- CLAUDE.md v2.4: 현재 상태=출시 완료·유지보수 모드(버그 수정·요청 기능만),
  결제 상품 실가격(월 4,400/년 44,000/평생 77,000), 출시·운영 메모로 재구성
  (신형 ASC 제출 방식·특가 코드·남은 확인 1건: 프로덕션 iCloud 왕복)
- HaruDanim.storekit: 로컬 테스트 가격을 실제 판매가와 일치
- Marketing: 체크리스트 완료 표시 + 실제 절차와 달랐던 점 기록,
  subscription-info 실가격 반영

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 14:58:41 +09:00
songyc macbook
ceb0ab8e16 feat(expiranner): 기록 날짜·시간 수정 + 매장별 지난 데이터 정리 + 주 시작 요일 설정
- RecordEditView 신규: 저장된 기록의 유통기한을 그래픽 달력 + '시간 추가'로 수정.
  날짜 상세 그리드의 길게 누르기 메뉴와 전체화면 뷰어 상단 버튼 양쪽에서 진입
- 설정 '데이터 관리'를 매장별로 분리: 지난 기록이 있는 매장만 행으로 나열해
  개별 삭제, 2개 매장 이상일 때만 '모든 매장에서 삭제' 행 노출(각각 확인 대화상자)
- 주 시작 요일 설정(일요일/월요일): 월 캘린더와 촬영 플로우 미니 달력의
  그리드·요일 기호·주말 색이 모두 따라감 (기본은 기존과 같은 일요일 시작)
- CLAUDE.md를 현재 동작(설정 화면, hasTime, 동적 색)에 맞게 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2HQuA6RPtkh45QTMN83i2
2026-07-28 02:29:36 +09:00
songyc macbook
2aa24d1df2 fix(marketing): IAP 심사 스크린샷을 640×920으로 재변환 — ASC 검사기 실규격
- 기기 전체 캡처(1290×2796)도 "크기가 잘못되었습니다"로 거부됨 —
  IAP 심사 스크린샷 검사기는 문서상 기기 규격 대신 640×920만 통과
  (Apple 개발자 포럼 thread/813399 확인)
- 원본은 iap-review-source.png로 보존, 재변환 명령을 체크리스트에 기록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 03:47:36 +09:00
songyc macbook
2dbef59dc6 chore(marketing): IAP 심사용 스크린샷을 전체 화면 원본으로 교체
- 크롭 패딩본(가격 잘림) → 실기기 전체 캡처 무가공(1290×2796, 허용 규격)
- 가격 3종·구매 복원·자동 갱신 고지·약관 링크가 온전히 보임

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 03:43:49 +09:00
songyc macbook
808638d0ce chore(marketing): IAP 심사용 스크린샷 준비 (1320×2868 규격 변환)
- 실기기 결제 화면 캡처(1024×1024 크롭)가 ASC 규격 검사에서 거부됨 —
  6.9" 세로 캔버스(1320×2868)에 앱 배경색 패딩으로 변환해 등록 가능하게
- subscription-info.txt 체크리스트에 파일 경로 기록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 03:40:29 +09:00
songyc macbook
62c28a7739 chore: 프로젝트 루트의 미사용 구 아이콘 원본(icon.heic) 삭제
- 프로젝트·에셋 어디에서도 참조 없음 확인 (현행 원본은 DesignAssets/)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:54:11 +09:00
songyc macbook
6b5e1dc20a fix(main): 새로고침 버튼 프리미엄 판정을 RefreshButton body 안으로 이동
- .toolbar { if PremiumManager.shared.isPremium } 조건은 @Observable 변경 시
  재평가가 보장되지 않아, 실행 중 프리미엄 전환(설정 테스트 토글·구매) 후
  버튼이 앱 재시작 전까지 나타나지 않는 실기기 결함 (아이폰·아이패드·맥 공통)
- ToolbarItem은 무조건 두고 RefreshButton body에서 판정 — View body는
  관찰 추적이 확실 (같은 body의 isRefreshing 전환이 검증된 패턴)
- 검증: Debug·Store 빌드, 무료(버튼 없음)/프리미엄(버튼 표시) 아이폰·아이패드 캡처

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:54:11 +09:00
songyc macbook
06b42118c9 fix(l10n): 워치 빈 상태 문구·위젯 횟수 단위의 en/ja 누락 보충
- 워치 카탈로그: rectangular 컴플리케이션 빈 상태 해결 안내 2건(목표/다짐)이
  카탈로그에 미추출 상태였음 — en/ja 워치에서 한국어로 표시될 결함
- 위젯 카탈로그: count.unit.one/other 누락 — en 위젯 횟수 표기가 "회"로
  폴백될 결함. IOS 카탈로그와 동일한 time/times·回로 통일
- Xcode 인덱싱이 빠진 키를 추가하며 드러남. 전 카탈로그 missing/stale 0,
  Debug·Store·워치 빌드 검증 완료 (포맷은 Xcode 표준 재직렬화 포함)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 17:46:24 +09:00
songyc macbook
6c4fe817bd feat(expiranner): 라이트/다크 모드 · 시간 포함 유통기한 · 지난 데이터 정리
- 설정 화면 신규(첫 화면 헤더 톱니 진입): 화면 모드(시스템/라이트/다크) 선택,
  '기간 지난 데이터 삭제'로 만료된 기록 일괄 정리(매장 무관, 확인 후 실행)
- Theme 색상을 라이트/다크 자동 전환 동적 색으로 전환, 기본값은 기존과 동일한 다크
- 유통기한에 시각(시:분) 선택 입력: 날짜 선택 후 '시간 추가' 버튼으로만 노출돼
  기본 사용성(사진→날짜→저장)은 그대로 유지, 유제품 등 필요 시에만 사용
- ProductRecord.hasTime 플래그 추가(기본 false, 라이트웨이트 마이그레이션),
  시각 포함 기록은 날짜 상세 그리드에 시각 배지 표시
- .gitignore에 Xcode 빌드 산출물/파생 데이터/SwiftPM 상태 추가해 상태 오염 방지

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J2HQuA6RPtkh45QTMN83i2
2026-07-23 17:46:12 +09:00
songyc macbook
7251e0c1cc docs(marketing): 출시 절차 체크리스트를 단계별 상세 로드맵으로 확장
- 계좌 승인 이후 → 출시까지 ①~⑪ 순서(대기 구간  표기)로 재구성
- ASC 이동 경로·업로드 파일 경로·심사 메모 예문·IAP 등록 세부까지 명시
- CloudKit 프로덕션 스키마 배포를 TestFlight 설치 전 필수로 강조

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 17:43:17 +09:00
songyc macbook
0b2bb9c55f fix(main): 새로고침 버튼을 프리미엄 전용으로 — 무료에선 숨김 + 도움말 중복 정리
새로고침의 쓰임새(iCloud 동기화 반영·위젯/워치 갱신)가 전부 프리미엄
기능이라 무료 사용자에겐 누를 이유가 없는 버튼 — 모음 탭 툴바에서
프리미엄일 때만 표시한다(실사용 피드백 2026-07-23).

- 도움말 '새로고침 버튼' 항목이 모음 탭 그룹에 2개 중복돼 있던 것을
  하나로 합치고, 프리미엄에서만 표시된다는 문구 추가
- 신규 문구 en/ja 완역, 구 문구 stale 2건 정리 (missing/stale 0)
- CLAUDE.md §6.1 툴바 규칙 갱신
- 검증: Debug/Store 빌드, 무료(-premium NO) 버튼 숨김·프리미엄 표시
  스크린샷

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 02:25:30 +09:00
songyc macbook
aaace2ed23 chore(marketing): 통계 비교 카드 반영 — 아이폰 04-stats ko/en/ja 재촬영·합성판 재생성
통계 탭 상단에 '지난주와 비교' 카드가 추가되어(커밋 ac40e14) 마케팅
주간 통계 컷이 실제 화면과 달라짐 — 원본·합성판 6장 갱신.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 02:07:15 +09:00
songyc macbook
ac40e14cfe feat(ux): UX 감사 반영 배치 — 시스템 테마·온보딩·일기 잠금·기간 비교 외
2026-07-23 사용성 감사(A그룹 5건 + 지시 추가분)를 한 번에 반영.

[테마] '시스템 설정 따름' 추가 + 기본값 light→system. "system"은 스킴을
  강제하지 않아(preferredColorScheme nil) 앱·위젯('앱 일치' 옵션,
  WidgetThemeOption.scheme: ColorScheme?)·DEBUG 위젯 미리보기까지
  시스템 라이트/다크를 그대로 따른다
[온보딩] 첫 실행 3장 소개(OnboardingView — 행동→목표·다짐→정리).
  데이터가 하나도 없고 본 적 없을 때만 1회(건너뛰기 포함 재표시 없음,
  onboarding.done), 시드·마케팅 촬영 플로우는 자동 건너뜀.
  설정 → 지원 '앱 소개 다시 보기'로 재열람
[일기 잠금] 설정 → 일기(iPad 전용 표시) 토글 — DiaryLock이
  .deviceOwnerAuthentication으로 Face ID/Touch ID/Optic ID+암호 폴백을
  기기별 분기 없이 처리. 일기 탭 진입 게이트(DiaryLockGateView),
  백그라운드 재잠금, 토글 변경 시 인증 요구, 잠글 수단 없는 기기는
  통과(영구 잠김 방지). NSFaceIDUsageDescription 추가(Info.plist+
  InfoPlist.xcstrings ko/en/ja)
[통계] 이전 기간 비교 카드(맨 위) — 총 시간·횟수를 어제/지난주/지난달과
  비교(▲▼%, 이전 기록 없으면 상태 문구). 이전 기간은 관계 기반
  Aggregator로 직접 집계, 필터 반영. 화면 전용(내보내기 미포함 의도)
[스플래시] 1.2→0.7초 단축 (하루에도 여러 번 여는 앱)
[워치] 행동 실행 탭 시 WKInterfaceDevice.play(.click) 햅틱 — 화면을
  안 보고 탭해도 접수 확인
[컴플리케이션] rectangular 빈 상태에 해결 안내("목표 편집에서
  '애플워치에서 보기'를 켜면 나타나요") — 옵트인 발견성 보완
[문구] 행동 편집기 꼬리표 색 규칙(여러 개면 가장 먼저 만든 꼬리표),
  새로고침 버튼 accessibilityHint

- 도움말 3주제 추가(새로고침 버튼·일기 잠금·이전 기간과 비교)
- 신규 문구 31키 en/ja 완역 + 워치 카탈로그 2키, missing/stale 0
- CLAUDE.md §6·§6.6·§6.7·§6.8·§10·§11·§14 갱신, DEBUG 인자
  -showOnboarding·-diaryLockScreen 추가
- 검증: Debug/워치/Store 빌드, 온보딩·설정·비교 카드·잠금 게이트·
  컴플리케이션 스크린샷

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 02:02:38 +09:00
songyc macbook
1dea41b472 feat(ux): 잠금화면 다짐 점 링 방식 + 즐겨찾기 순서 변경 시트 (실기기 피드백 2건)
첫 출시 전 반영 요청된 사용성 개선 — 둘 다 표시 계층·기기 로컬 설정만
건드리는 안전 범주.

① 잠금화면 위젯 다짐 점: '아래에서 차오르는 물높이' 채움은 5~6pt에서
   90%↔100% 차이(위쪽 1px)가 배경에 따라 사실상 안 보임 —
   **미완료 = 링(호) 진행(시작 최소 10%, 완료 직전에도 틈이 보이게
   최대 88%까지만 감김) / 완료 = 꽉 찬 원반**으로 교체. 링 끝의 틈은
   둘레에 생겨 눈에 띄고, 완료는 면적(빈 링 vs 원반) 자체가 달라
   어떤 배경에서도 구분된다. ratio 그대로라 '이하 유지'는
   한도 안=원반/초과=빈 트랙으로 의미 유지 (§10 문서화)

② 즐겨찾기 순서 변경: 행동 탭 ⋯ 메뉴에 '즐겨찾기 순서 변경' 시트
   추가(2개 이상일 때, 꼬리표 순서 시트와 동일 패턴 — 닫힐 때 1회
   커밋). LocalPrefs.reorderFavorites는 전역 배치에서 즐겨찾기가
   차지한 자리들만 재배열해 나머지 행동·위젯 기본 슬롯 무영향.
   모음 탭 즐겨찾기 섹션·애플워치 즐겨찾기가 같은 순서를 읽으므로
   세 표면이 자동 일관 (§6.2·§6.1·§11 문서화).
   move(fromOffsets:)는 SwiftUI 확장이라 Foundation 계층에 동일
   의미로 직접 구현

- 도움말 '즐겨찾기 모아 보기' 본문에 순서 변경 경로·워치 적용 추가
- 신규 문구 4키 en/ja 완역, 옛 본문 stale 정리 (missing/stale 0)
- §14에 -actionShowFavoriteOrder 검증 인자 추가
- 검증: Debug/Store 빌드, 잠금 위젯 프리뷰·순서 시트 스크린샷

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:38:16 +09:00
songyc macbook
14b18bc22a fix(review): 전체 코드 리뷰 2차 완료 — 횟수 단위 en 단복수 + 명세 문서화
1차(c18e3c7)에 이어 나머지 전 영역을 세션 본체가 직접 정독 완료:
위젯 10파일·인텐트, 앱 셸(ContentView/Settings/Help/Radial/SymbolCatalog),
워치 전체(페이로드·동기화·앱·컴플리케이션), 일기 전체(6파일 ~4.2k줄),
내보내기 뷰부·CSV, MainView·ActionViews 잔여 — 추가 결함 1건만 발견.

[L] 모음 탭 횟수 셀: 큰 숫자와 단위("회")를 분리 렌더링하는 유일한
    지점이라 en에서 1일 때 "1 times"가 됨 — Format.countUnit(단복수
    분기, 명시 키 count.unit.one/other)로 수정. 단독 "회" 키는 사용처
    소멸로 정리 (ja 「回」는 단복수 무관)

문서(CLAUDE.md): 이번 리뷰로 확정된 동작 규칙 4건을 명세에 반영 —
세션 편집 원본 초 보존·0길이 차단(§6.5), 타임테이블 HH:mm 라벨(§6.5),
필터 활성 실재 행동 기준(§6.5), 통계 동명 구분 Format.disambiguated(§6.6)

정독 제외(사유 명시): DebugSeed·WidgetPreviewScreen·ComplicationPreview
(DEBUG 전용), 워치 엔트리 2파일(41줄), HelpView 본문 문구부(카탈로그
검증으로 커버), ExportImageView PhotoSaver(~40줄)

검증: Debug/Store 빌드, 카탈로그 missing/stale 0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:17:38 +09:00
songyc macbook
c18e3c7c6f fix(review): 전체 코드 리뷰 1차 — 데이터 복구·통계 표시·기록 편집 결함 수정
'처음 보는 리뷰어' 관점 전체 검증(핵심 계산·데이터 계층·기록/통계 완료,
나머지 영역 진행 중)에서 확인된 결함 수정. 핵심 계산부(DayMath·
QuestProgress·Models)는 발견 0건.

[M] DataStore: 스토어 손상 백업 복구 직후 legacy 이관 가드(타깃 없음)가
    다시 열려 구 샌드박스 스토어(영구 잔존)가 부활 — 수개월 전 데이터로
    조용한 롤백. App Group 플래그(migration.legacyStoreImported)로 평생
    1회 보장 (§5.1 문서화)
[M] 통계 시리즈가 행동/꼬리표 이름 키 — 동명 2개면 차트가 한 선으로 합쳐
    지고 Identifiable id 충돌, 동명 꼬리표는 합산. Format.disambiguated
    (이름 (2) 형식)로 통계 탭·통계 내보내기·⑤ 위젯 3표면 통일, 꼬리표
    집계는 identity 키로 재작성 (수치는 기존과 동일, 표시·범례만 구분)
[L] SessionAlertManager: 시작→즉시 종료 연타 시 조회(await)~추가 사이
    경합으로 종료된 세션의 장시간 알림이 잔존 — 세대 카운터로 마지막
    호출만 확정
[L] 세션 편집기: 분 절사 값을 무조건 덮어써 1분 미만 세션이 메모만
    고쳐도 0초로 파괴, 시작=종료 0길이 기록은 저장돼도 어디에도 안 보임
    — 안 움직인 필드는 원본 시각(초) 보존 + 0길이 저장 차단(문구 갱신)
[L] 타임테이블 시간축: 하루 시작이 정시가 아니면(06:30) 라벨이 시만
    표기해 최대 59분 어긋남 — 분 성분 포함(HH:mm), 화면·내보내기 동일
[L] 기록·통계 필터: 제외했던 행동을 삭제하면 잔존 ID로 칩·내보내기
    필터 문구가 허위 활성 — 실재 행동 기준으로 판정
[L] 목표 편집: 시작일을 종료일 뒤로 옮기면 종료<시작 저장 가능(DatePicker
    in: 은 표시 제약만) — 저장 시 정규화

+ QuestEditor·TagViews·GoalViews·인텐트·WidgetSupport 정독 — 추가 발견 없음
+ §15-11 서브 에이전트 금지 명문화 (사용자 지시)

검증: Debug/Store 빌드, 카탈로그 missing/stale 0 (새 문구 2키 en/ja)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:05:16 +09:00
songyc macbook
28a453485d feat(main): 배치 편집을 즐겨찾기 섹션 인지형으로 — 끌어서 지정·해제 + '지정 순서' 규칙
즐겨찾기 v2(e09a0b7) 후속 실사용 피드백 세 가지 반영:
①즐겨찾기 안에서 순서 바꾸기가 어렵다 ②새로 지정하면 꼬리표(전역)
순서에 끼어들어 예측이 안 된다 ③배치 편집이 즐겨찾기가 없다는 듯
통짜 그리드로 떠서 디테일이 떨어진다.

- 배치 편집도 즐겨찾기/나머지 섹션 구조 그대로(항상 펼침): 섹션 안
  드래그는 실시간 순서 변경, **섹션 사이 드래그는 드롭 확정 시점에
  즐겨찾기 지정·해제 + 그 위치로 이동**(commitDrop). 호버 중 교차
  이동은 자기 섹션 안 점프로 보여 moveDragging이 무시
- 빈 섹션은 점선 드롭 존(호버 하이라이트)이 받는다 — 즐겨찾기 0개
  상태에서도 끌어서 지정 가능, 전부 즐겨찾기면 해제 존 표시
- **새 즐겨찾기는 배치 순서상 블록 끝으로**(LocalPrefs.placeNewFavoriteAtEnd
  — 롱프레스 메뉴·행동 탭 스와이프·상세 토글 3경로 공통). 해제는
  위치 무이동(나머지 상단 근처에 남음), 첫 즐겨찾기도 무이동
- 도움말 본문에 순서 규칙·끌어서 지정 사용법 반영, en/ja 번역 +
  stale 1키 정리 (드롭 존 문구 2키 포함 missing/stale 0)
- 검증: Debug/Store 빌드, 아이폰·아이패드 편집 모드 + 브라우즈
  스크린샷 (isFavorite는 모델 필드라 DataChange.commit 경유 유지)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 17:18:45 +09:00
songyc macbook
6c4cac74cb chore(marketing): 즐겨찾기 섹션 v2 반영 스크린샷 재촬영
아이폰 6.9"/아이패드 13" 01-main과 도움말 help-main을 ko/en/ja로
재촬영(시드 즐겨찾기 3개 반영)하고 합성판 재생성. 02~04는 무변경.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 16:56:20 +09:00
songyc macbook
e09a0b74de feat(main): 즐겨찾기 v2 — 별도 카드 줄을 그리드 섹션 통합 + '나머지' 접기로 교체
즐겨찾기 빠른 실행 줄(7d17917)이 그리드와 셀 크기·배경이 달라 '따로
노는 느낌'이고 같은 행동이 두 번 보인다는 실사용 피드백 반영. 도입
의도(행동이 많아져도 자주 쓰는 것만 모아 보기)는 유지하고 형태만 교체.

- 즐겨찾기를 별도 카드가 아니라 그리드의 첫 섹션으로: 통짜 그리드와
  같은 actionGrid(_:) 빌더를 공유해 셀 크기·열 규칙·맥 폭 보정이 항상
  동일(v1의 컴팩트 셀·맥 특례 폭 제거). 중복 노출도 사라짐
- '나머지 행동 · N개' 섹션은 헤더 탭으로 접기/펼치기(기기별
  local.mainOthersCollapsed, 기본 펼침, 셰브론 회전) — 행동이 많아도
  접으면 즐겨찾기만 남는다. 숨기는 행동은 없음(위치만 승격, 그리드
  완전 숨김 방식 기각은 유지)
- 편집(배치) 중에는 기존처럼 통짜 그리드(배치 순서는 하나뿐)
- 시드 즐겨찾기 1→3개(독서·달리기·물 마시기), -mainOthersCollapsed
  DEBUG 인자 추가(접힘 표시 강제 — 표시 전용, 실 설정 무변경)
- 도움말 '즐겨찾기 모아 보기'로 개편 + en/ja 번역, stale 2키 정리
- 검증: Debug/Store 빌드, 아이폰 기본·접힘·편집 + 아이패드 + 맥 강제
  레이아웃 스크린샷 5종, 카탈로그 missing/stale 0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 16:56:20 +09:00
songyc macbook
98653458c1 chore(marketing): 즐겨찾기 줄 반영 스크린샷 재촬영 + 서류 완료·ASC 체크리스트 갱신
모음 탭 즐겨찾기 빠른 실행 줄(7d17917)이 기존 스크린샷에 없어
아이폰 6.9"/아이패드 13" 01-main과 도움말 help-main을 ko/en/ja로
재촬영(상태바 9:41 오버라이드, 로케일별 재시드)하고 합성판 재생성
— 합성 도구는 결정적이라 02~04 합성판은 바이트 동일 무변경.
en 샷은 직전 l10n 수정('Favorites', 'Show 1 more quest')까지 반영.

문서:
- CLAUDE.md: 통신판매업 신고 완료(2026-07-22) 반영 — 서류 절차 종료,
  ASC 등록 진행 가능. 재촬영·en 복수형 정리 이력 추가
- Marketing/README·subscription-info: 한국 전자상거래법 판매자 정보
  (사업자등록번호·통신판매업 신고번호) 입력, IAP 심사용 스크린샷
  캡처 순서(상품 등록 후 TestFlight에서), 첫 심사 시 IAP 3종 동반
  제출 항목 보강

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 02:50:28 +09:00
songyc macbook
59251df41d fix(l10n): en 복수형 plural variation 정리 + 'Favorites' 표기 통일
수량이 1일 때 "1 times / 1 quests / 1 actions"처럼 읽히던 en 문자열
14건(iOS 10·위젯 3·워치 1)을 카탈로그 plural variation(one/other)으로
전환. SwiftUI 보간 키(%lld…)라 코드 변경 없이 런타임에 단복수가
자동 선택된다. 모음 탭 즐겨찾기 섹션 제목 en은 'Favorite'→'Favorites'로
워치 카탈로그와 통일(스토어 스크린샷 노출 문구). ko/ja 값 무변경.

- 직렬화 스타일 보존: IOS는 Xcode(" : "), 위젯·워치는 xcstringstool(": ")
  포맷 그대로 재직렬화(라운드트립 바이트 동일 확인 후 적용)
- Debug·워치 빌드 통과 + 9개 카탈로그 missing/stale 0 재확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 02:50:17 +09:00
songyc macbook
bb78345882 fix(mac): widen favorites quick-access cells on Mac
즐겨찾기 빠른 실행 셀(108pt 고정)이 맥(Designed for iPad) 축소 매핑
보정을 받지 않아 그리드 버튼(200~280pt)과 비례가 안 맞고, xLarge 글자
보정과 겹치면 긴 이름이 잘릴 여지가 있었다 — 최초 구현 때 맥 레이아웃
검증(-forceMacLayout)을 빠뜨린 것.

- 맥에서만 셀 폭 108→150pt (그리드 버튼 150→200과 같은 보정 비율)
- 아이폰·아이패드는 기존 108pt 그대로 (런타임 분기, 무영향)
- 맥 강제 레이아웃 스크린샷 검증 + progressSelfTest 37건 ALL PASS +
  인텐트 스모크 10/10 + Debug/Store/워치 3스킴 빌드 + 9개 카탈로그
  missing/stale 0 재확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-22 02:11:09 +09:00
songyc macbook
7d17917609 feat(main): add favorites quick-access row to Home tab
행동이 많아질수록 모음 탭이 복잡해진다는 실사용 피드백에 대한 1차 대응.
22개 시드로 iPhone·iPad·맥 4가지 레이아웃을 직접 시뮬레이션해 대안 A~F를
검토했고, 가장 저위험인 A(즐겨찾기 재사용)만 이번에 구현했다.

- Action.isFavorite(행동 탭과 동일 필드)를 켠 행동을 모음 탭 상단에
  가로 스크롤 한 줄로 노출 (전체 그리드에서는 제외하지 않음 — 숨기는
  방식은 검토 후 기각)
- 롱프레스 메뉴에 즐겨찾기 지정·해제 버튼 추가, 전체 그리드·즐겨찾기
  줄이 메뉴 구성을 공유하도록 리팩터
- 도움말에 새 주제 추가 + 관련 en/ja 번역, CLAUDE.md §6.1 문서화
- 감사 겸 아이콘 전용 버튼 접근성 라벨 누락 3건 수정(일기 할 일 체크박스,
  아이콘 선택기, 꼬리표 색 프리셋) — §15 컨벤션 위반이라 저위험 즉시 수정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-21 17:51:53 +09:00
songyc macbook
dbdf4e32df chore(l10n): accept Xcode catalog re-serialization (content-identical)
- 사용자 Xcode 빌드가 카탈로그 2개를 자기 포맷으로 재직렬화 — JSON 파싱 비교로
  내용 완전 동일 확인 (Localizable 786키 값·상태·manual 마킹 전부 보존)
- 유일한 실변화: InfoPlist의 CFBundleName extractionState(extracted_with_value) 제거
  → 수동 관리로 전환되어 앞으로 Xcode 추출이 현지화 값을 되돌리지 않음 (§2.3 방어와 동일 효과)
- 맥 앱 이름이 다시 Haru_Danim으로 보인 원인은 파일이 아니라 LaunchServices의
  유령 등록(삭제된 옛 래퍼 사본 4건)이었음 — lsregister로 정리 완료, 살아 있는
  래퍼·산출물에는 ko 하루 다님/en·ja Haru Danim 정상 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-20 15:55:52 +09:00
songyc macbook
6d6f9f08ad fix(mac): localize CFBundleName so Mac menu bar shows proper app name
- 실사용 보고: 아이폰·아이패드는 '하루 다님'인데 맥 메뉴 막대는 'Haru_Danim'
- 원인: 맥은 CFBundleName을 표시하는데, InfoPlist 카탈로그의 CFBundleName이
  원시값 "Haru_Danim"(ko만, shouldTranslate=false)으로 추출돼 있었음 —
  iOS 홈 화면은 CFBundleDisplayName(정상 현지화)이라 드러나지 않던 값
- 수정: 카탈로그 CFBundleName을 ko '하루 다님' / en·ja 'Haru Danim'으로 교정
  (CFBundleDisplayName과 동일 표기), shouldTranslate 플래그 제거
- 베이스 Info.plist의 CFBundleName은 생성기가 PRODUCT_NAME으로 항상 덮어써
  교체 불가(클린 빌드로 검증) — 미지원 언어도 개발 언어(ko) 폴백이라 원시값
  노출 없음, Info.plist에 주석으로 기록
- 검증: 빌드 산출물 ko/en/ja InfoPlist.strings 값 확인, Debug/Store/맥 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-20 12:47:15 +09:00
songyc macbook
003859ee10 feat(mac): readability pass for Designed-for-iPad on Mac
- 실사용 보고: 맥에서 아이패드 앱 실행 시 버튼·정보가 전반적으로 매우 작게 보임
  (아이패드 포인트의 맥 축소 매핑 + 폭이 넓어져도 콘텐츠를 키우지 않는 레이아웃)
- DeviceLayout.isMac(isiOSAppOnMac) 신설, 맥에서만:
  ① 전역 dynamicTypeSize 최소 xLarge (사용자가 시스템에서 더 키우면 그 값 존중)
  ② 모음 탭 목표 카드 폭 430~640 / 행동 버튼 폭 200~280으로 상향
  ③ 사이드바에서 일기 탭 숨김 (AppTab.sidebarCases — 펜슬 필기 전제 기능이라
     맥에선 진입점 제거, 데이터는 보존되어 아이패드에서 계속 사용)
- 아이폰·아이패드 무영향 (isMac=false 경로 불변, 아이패드 심 회귀 스크린샷 확인)
- 검증: -forceMacLayout 인자 신설(아이패드 심에서 맥 분기 강제) — 일기 숨김·
  버튼 확대·글자 확대 확인. 맥(Designed for iPad) 대상 빌드 성공. 새 문자열 없음
- CLAUDE.md §6 맥 보정·§14 인자 기재. 맥 위젯·일기 마우스 입력은 출시 후 과제

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-20 12:24:49 +09:00
songyc macbook
1283c1f799 fix(ipad): unify action button heights across tracking types
- 실사용 보고: 아이패드 모음 탭에서 시간형·횟수형 행동 버튼 높이가 다름
- 원인: 횟수형 푸터의 27pt 숫자로 셀 자연 높이가 유형별로 다른데(시간형 ~104 캡,
  횟수형 ~118), 아이패드 AdaptiveColumnsLayout(43be9c0)은 셀 고유 높이를 그대로
  배치해 차이가 노출 — 아이폰 LazyVGrid는 행 높이로 늘려 맞춰 가려졌음
- 수정 ①: 푸터에 횟수형 숫자 크기의 hidden 템플릿을 깔아 두 유형의 자연 높이 통일
  (magic number 없이 폰트에서 산출, compact 모드 포함, 접근성 숨김)
- 수정 ②: AdaptiveColumnsLayout.place가 LazyVGrid처럼 행 높이를 셀에 제안 —
  행 안 raggedness 제거. 측정(sizeThatFits) 불변이라 스크롤 진동 버그와 무관,
  고정 높이 목표 카드는 무영향
- 검증: 아이패드(3열 혼합/동일 유형 행)·아이폰 3열·compact 5열 스크린샷 균일 확인,
  Debug/Store 빌드 성공. 새 문자열 없음. CLAUDE.md §6.1 규칙 기재

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-20 00:57:09 +09:00
songyc macbook
e34ce8fa31 docs(ui): clarify per-device scope of 'ignore short sessions' setting
- 실사용 보고: 기기 간 시작·종료(아이폰↔아이패드↔워치) 시 짧은 기록이 저장되는 현상
- 원인: 설정이 기기별(App Group defaults, iCloud 미동기화)이고 검사는 '종료를 실행한
  기기'의 설정 기준 — 워치 종료는 페어링 아이폰에서 실행되므로 아이폰 설정 적용.
  기기마다 설정값이 다르면 짧은 기록이 저장됨 (로직 결함 아님, 모든 종료 경로에 검사 존재)
- 동결 중 동작 변경 대신 문구를 실제 동작에 맞게 명시: 설정 '측정' 푸터 + 도움말
  '짧은 기록 무시' 주제에 기기별 저장·종료 기기 기준·워치=아이폰 규칙 추가 (ko/en/ja)
- en 기능명 표기를 피커와 동일한 'Ignore short sessions'로 통일, ja는 計測 용어 유지
- 검증 인자 -settingsScrollMeasure 신설(측정 섹션 스크롤) — ko/ja/en 푸터 렌더 확인
- 카탈로그: 신규 2키(en/ja 완비), 옛 2키 stale 정리 — missing 0·stale 0
- CLAUDE.md §6.8 기기별 동작 명시 + §14 인자 추가. Debug/Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 23:09:56 +09:00
songyc macbook
459c85700f fix(ui): smooth expand/collapse animation for time input rows
- 시각 입력 값 행의 펼침/접힘이 "확" 스냅된다는 실기기 피드백 → 조건부 삽입(if) 대신 높이 0↔216pt 프레임 보간(.smooth 0.3s, 바운스 없음)으로 변경 — List/Form 행 높이가 매 프레임 따라와 부드럽게 열리고 닫힘. 공용 CollapsibleTimeWheel 한 곳 수정으로 6곳(기록 편집 4시트·마감 시각·하루 시작 시간) 전부 적용
- 휠은 Color.clear의 overlay(top 고정)로 띄움 — UIDatePicker의 고유 높이(216)가 레이아웃에 개입해 접힘 상태에 빈 공간이 남던 문제(1차 구현에서 발견) 방지. 접힘 시 clipped+터치 차단+보이스오버 숨김
- 값 반영 경로·검증(종료<시작 경고 등) 불변, 새 문자열 없음(카탈로그 클린)
- 검증: 세션 수정 접힘(빈 공간 없음)·설정 펼침 시뮬 스크린샷, Debug/Store 빌드 성공. CLAUDE.md §6.5에 보간 구조 유지 규칙 기재

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 09:59:33 +09:00
songyc macbook
7baa7a424c feat(ui): unify all time inputs as collapsible value rows
- 상시 노출 휠이 화면을 차지해 어수선하다는 실기기 피드백 → 설정 '하루 시작 시간'의 값 행+탭 펼침 패턴을 전 시각 입력으로 통일 (사용자 지시)
- 공용 CollapsibleTimeWheel 신설(값 행: 라벨+현재 값+셰브론 → 탭하면 인라인 휠 펼침, 기본 접힘) — 기록 수정·추가 4개 시트(시작/종료/기록 시각), 다짐 '마감 시각', 설정 '하루 시작 시간'(기존 개별 구현을 공용으로 교체) 총 6곳 적용
- 값 표시는 로케일 날짜 포맷(날짜+시각 또는 시·분) — 새 문자열 없음. 접힘/펼침은 표시 상태일 뿐 값 반영 경로는 검증된 인라인 휠 그대로(팝오버 금지·범위 제약 금지·분 절사 불변), 종료<시작 경고·저장 비활성도 유지
- 검증: 세션 수정(값 행 2개)·시간 기록 추가·다짐 마감 시각·설정 펼침 상태 시뮬 스크린샷, Debug/Store 빌드 성공, 카탈로그 9종 클린. CLAUDE.md §6.5 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 09:10:29 +09:00
songyc macbook
43be9c0aa9 fix(ipad): main-tab scroll oscillation — replace lazy adaptive grids
- 아이패드 모음 탭에서 맨 아래로 스크롤하면 화면이 위아래로 무한 진동하며 터치가 안 먹는 실기기 버그 — lazy 컨테이너의 화면 밖 높이 "추정"이 높이 제각각인 목표 카드의 실제 높이와 어긋나 콘텐츠 높이가 출렁이고, 1초 타이머 갱신이 매초 이를 걷어차 진동이 지속되는 레이아웃 피드백 루프로 분석
- 수정: iPad 전용 비-lazy `AdaptiveColumnsLayout`(커스텀 Layout) 신설 — LazyVGrid(.adaptive)와 동일한 열 계산(목표 340~520·행동 150~220, 행 내 위 정렬·왼쪽 정렬)으로 시각 결과는 그대로 두고 전 항목 즉시 배치로 높이 추정을 원천 제거. 항목 수가 적어 성능 부담 없음
- 목표 카드 영역 + 행동 그리드 둘 다 적용(통일, 사용자 지시). iPhone 경로(고정 열 LazyVGrid·페이징)는 무변경
- 검증: iPad 모음(카드·그리드·행 배치)·배치 편집 모드·iPhone 모음 시뮬 스크린샷 — 기존과 동일 렌더. 진동 재현은 스크롤 제스처 자동화 불가로 실기기 확인 필요(같은 절차: 측정 여러 개 켠 상태로 맨 아래 스크롤)
- 새 문자열 없음(카탈로그 클린), 도움말 무변경. CLAUDE.md §6.1에 원인·재발 방지(다시 lazy로 되돌리지 말 것) 기재. Debug/Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 08:41:31 +09:00
songyc macbook
ddd46a4084 feat(widget): lock-screen quest dots fill by progress ratio
- 잠금화면 위젯 '다짐 점'이 달성/미달성 이진 채움이라 진행 정도를 알 수 없다는 보고 → 각 점이 진행률(ratio)만큼 아래에서부터 차오르게 변경. 표시 전용 소형 뷰 수정이라 위험 낮음 판단 후 진행
- ratio를 그대로 쓰므로 달성=완전 채움(기존과 동일), '이하 유지'는 ratio가 1/0이라 한도 안=채움/초과=빈 점 동작 불변. 작은 크기(5~6pt)에선 부채꼴보다 물높이 방식이 가독성 좋아 채택
- 위젯 미리보기 잠금 섹션에 '다짐 여러 개+주간' 항목 추가 — 부분 채움(반쯤 찬 점/빈 점/가득 점) 시뮬 스크린샷으로 circular/rectangular 모두 확인
- 새 문자열 없음(카탈로그 클린), 도움말 무변경(스타일 세부 서술 없음). CLAUDE.md §10 갱신. Debug/Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 05:36:46 +09:00
songyc macbook
e1537b32f3 feat(widget): stop button on Live Activity lock-screen banner
- 잠금화면 실시간 현황(라이브 액티비티)에 종료 수단이 없다는 보고 → 배너 오른쪽에 노란 정지 버튼 추가. 워치·⑥ 위젯과 같은 검증된 경로(NowRunningStopButton → RunActionIntent 토글) 재사용이라 위험 낮음 판단 후 진행
- ContentState에 actionID(optional) 추가 — 앱 업데이트 전 인플라이트 액티비티(키 없음)도 안전 디코딩(WatchSnapshot 선례), 없으면 버튼 없이 기존 표시
- LockScreenActivityView를 NowRunningWidget.swift로 이동 — @main 파일은 앱 타깃에서 제외라 앱 내 위젯 미리보기(-widgetPreview)에서 배너를 렌더하기 위함(동작 불변). 미리보기 최상단에 배너 박스 신설
- 다이나믹 아일랜드 스모크 확인(상태 필드 추가 회귀 없음 — 콤팩트 정상 표시). 실기기 확인 항목: 잠금화면에서 정지 버튼 탭 시 즉시 종료
- 도움말 '다이나믹 아일랜드·잠금화면' 문구에 정지 버튼 안내 추가(ko/en/ja, stale 정리), CLAUDE.md §9 갱신. Debug/Store 빌드 성공, 카탈로그 9종 클린

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 04:46:38 +09:00
songyc macbook
7c8e882cda chore(l10n): shield DEBUG-only strings from Xcode auto-resave pollution
- Xcode 백그라운드 인덱싱이 IOS 카탈로그를 재저장하며 DEBUG 전용 문자열(시드 이름·메모) 18키를 stale로 잘못 마킹하는 오염이 두 번 재발 → 해당 키들을 extractionState: manual로 마킹해 Xcode·xcstringstool 모두 건드리지 않게 방어(sync 후 유지 확인, 런타임 번역 무영향)
- CLAUDE.md §2.3에 오염 증상·복원법·manual 규칙 기재, §1 현재 상태에 실기기 확인 완료된 최근 수정 라운드 반영
- 검증: Debug 빌드 + sync 후 카탈로그 9종 ALL CLEAN, Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 10:01:42 +09:00
songyc macbook
dbbbfb8506 fix(settings): collapse day-start time wheel into a value row
- 설정 '하루 시작 시간'의 상시 노출 휠이 화면을 계속 차지한다는 실기기 피드백 → 평소엔 값 행(라벨 + 현재 시각 + 셰브론)만 보이고 탭하면 인라인 휠이 펼쳐지는 방식으로 변경
- 팝오버(컴팩트)로 되돌리지 않음 — 다이얼 감속 중 닫힘 시 정착값 유실 문제가 재발하므로 인라인 휠 유지가 안전. 접힘/펼침은 표시 상태일 뿐 값 반영 경로는 동일
- 접근성: 행에 라벨+현재 값 낭독. 마감 시각·기록 편집기는 일시적 시트라 상시 노출 유지 (§6.5 문서화)
- 검증 인자 -settingsShowDayStartWheel 신설(펼친 상태로 시작) — 접힘·펼침 스크린샷 확인, Debug/Store 빌드 성공, 카탈로그 무변화(외부 재저장으로 오염된 워킹트리 카탈로그는 HEAD로 복원)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 09:18:35 +09:00
songyc macbook
9626e6841e feat(help): example screenshots in help topics (ko/en/ja)
- 도움말이 글만 있어 처음 사용자가 이해하기 어렵다는 피드백 → 그룹당 대표 주제 1개에 예시 스크린샷 추가 (모음 탭·목표 진행률·기록 타임테이블·글래스 버블 메뉴·워치 첫 화면·iPad 일기 요약, 총 6종)
- 스크린샷에 UI 문구가 박혀 있어 언어별 파일로 관리 — 시뮬 로케일별 재시드로 ko/en/ja 각각 촬영(18장, 축소·JPEG 압축 총 ≈1.6MB), IOS/HelpImages/에 배치. HelpImage 로더가 표시 언어에 맞는 변형 선택(jpg는 UIImage(named:) 확장자 생략 탐색에 안 걸려 URL 로드)
- 워치 이미지는 시뮬 페어링 특유의 빨간 연결 끊김 아이콘을 상태바 크롭으로 제거 — '측정 중 행 탭 종료' 신기능이 이미지에 그대로 담김
- 검증 인자 신설: -helpExpandAll(전 주제 펼침), -helpScrollTo <앵커>(이미지 주제로 스크롤) — ko/en 아이폰·ko 아이패드 도움말 화면 렌더 스크린샷 확인
- 이미지는 accessibilityHidden(본문 낭독과 중복 방지). 새 문자열 없음(카탈로그 무변화). CLAUDE.md §6.8·§14 갱신. Debug/Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 07:15:46 +09:00
songyc macbook
79c16b9038 feat(watch): tap the running row on watch home to stop tracking
- 워치 첫 화면 '측정 중' 행이 표시 전용이라 종료하려면 꼬리표/즐겨찾기로 행동을 찾아가야 했던 불편 수정 — 행을 탭하면 대표 측정이 바로 종료됨
- 종료는 행동 목록 탭과 완전히 같은 run 명령 경로 재사용 — 아이폰 쪽 처리(짧은 기록 무시·위젯·라이브 액티비티·동기화)는 기존 그대로라 동기화가 엉킬 여지 없음
- WatchSnapshot에 runningActionID(optional) 추가 — isFavorite와 같은 구버전 캐시 호환 패턴, 구캐시는 이름 매칭 폴백(runningAction 헬퍼)
- UI: 오른쪽 노란 정지 아이콘 + "누르면 측정이 종료돼요" 푸터 + 접근성 라벨. 대표를 못 찾는 이례적 경우엔 기존 표시 전용 유지
- 검증: 페어링 심 E2E — 워치 첫 화면에 종료 버튼 렌더 → -autoStopRunning(신설 인자, 탭과 동일 경로) → 아이폰 세션 종료·모음 탭 반영 스크린샷 확인
- 도움말 워치 항목 문장 추가(ko/en/ja), 워치 카탈로그 2키 번역, 전 카탈로그 클린. CLAUDE.md §11·§14 갱신. iOS Debug/Store + 워치(최소 OS 26.2·11.5 둘 다) 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 05:32:10 +09:00
songyc macbook
da515a8f71 fix(ui): quest-less goals show status text instead of 0% + Swift 6 warning cleanup
- 다짐 없는 목표의 진행률 0% 표기(실패로 오독)를 상태 문구로 교체 — 사용자 승인 방식 ③
  · 위젯 ② 목표 진행바: 0% 바 3줄 대신 "다짐이 없어요" (④와 동일 문구·기존 처리와 통일)
  · 일기 '이 날의 목표' 헤더: "다짐 없음" + 게이지 생략 (기존 캡션은 유지)
  · 모음 탭 카드(게이지 블록 미표시)·위젯 ④·시리(오류 응답)는 이미 처리돼 있어 무변경
  · 잠금화면·워치 컴플리케이션은 공간 제약으로 수치 유지 — '수행일 아님'과 같은 의도된 단순화(§4.3 문서화)
- Swift 6 대비 경고 정리(사용자 승인): DiaryTemplateRenderer.renderPDFPage·DiaryPageMetrics를
  nonisolated로 선언(순수 CoreGraphics — 백그라운드 렌더 호출부와 격리 일치), DiarySectionConfig
  마이그레이션 onAppear 클로저 교정 — iOS 앱 타깃 경고 0
- 검증 인자 -seedEmptyGoal 신설(다짐 없는 목표 시드, 기본 시드·마케팅 스크린샷과 분리)
- l10n 신규 2키 ko/en/ja(다짐 없음·시드 목표 이름), 카탈로그 클린. CLAUDE.md §4.3·§14 갱신
- 검증: 위젯 ② 프리뷰·일기 카드 시뮬 스크린샷, Debug/Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 00:49:36 +09:00
songyc macbook
623217b907 fix(l10n): natural English word order for quest summaries + help refresh
- 전체 점검(코드 정독 + 폰·패드·워치 시뮬 검증)에서 발견된 번역·도움말 보완
- 다짐 요약 en 어순 수정: "30m Reach at least" → "Reach at least 30m" — 포맷 키 '%@ · %@ %@'의 en을 위치 지정자(%1$@ · %3$@ %2$@)로 재배열, ko/ja 불변
- 시리 다짐 엔티티 부제가 일반 보간이라 카탈로그를 안 타던 것을 String(localized:)로 교정 — 위젯 카탈로그에 같은 키 번역 추가
- 도움말 일기 항목에 달력 기분 사진 배경 안내 한 문장 추가 (ko/en/ja, stale 키 정리)
- CLAUDE.md §14: -premium 인자가 콜드 스타트 동안만 유효함(지속은 DEBUG 토글) 명시
- 검증: 9개 카탈로그 missing/stale 클린, 인텐트 스모크 10/10, progressSelfTest 37건 PASS, streak 덤프 정상, 3개 스킴(iOS Debug/Store·워치) 빌드 성공, en 목표 탭 스크린샷으로 어순 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 00:31:11 +09:00
songyc macbook
a400a71896 feat(ui): unify time wheels + diary calendar mood-photo backlayer
- 다짐 '마감 시각'·설정 '하루 시작 시간'의 컴팩트 시각 픽커도 RecordTimeWheel(시·분 전용)로 교체 — 기록 편집기와 같은 팝오버 커밋 유실 기전 제거, 앱의 시각 다이얼 전부 상시 노출 휠로 통일
- 일기 달력: 기분 사진이 있는 날짜는 셀 배경(백레이어)에 사진 썸네일 표시 — 이모지/연필 마커·오늘 표시는 그대로 위에 유지, 사진 없으면 기존과 동일. ImageIO ≤220px 축소 + NSCache(DiaryMoodThumbs)로 한 달치 렌더 부담 최소화, 검은 스크림 0.16+흰 날짜·마커 그림자로 가독성 확보
- 사진만 있는 엔트리는 hasContent가 moodImageData를 포함해 빈 엔트리 정리에서 보존됨(기존 로직 확인)
- 검증 인자 -diarySeedPhoto 신설(오늘=이모지+사진·어제=사진만) — iPad 시뮬 달력 스크린샷으로 백레이어·마커 확인, 마감 시각·하루 시작 시간 휠 스크린샷 확인
- l10n 무변화(기존 키 재사용, 카탈로그 클린). CLAUDE.md §6.5·§6.7·§14 갱신. Debug/Store 두 스킴 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-18 00:03:04 +09:00
songyc macbook
9825be505f fix(history): record time editing — always-visible wheel dials
- 기록 수정·추가 시트 4곳의 시각 입력을 컴팩트 팝오버에서 상시 노출 휠 다이얼(RecordTimeWheel)로 교체 — 팝오버 다이얼이 감속 중 닫히면 정착값이 바인딩에 반영되지 않던 실기기 보고 수정. 다이얼 = 표시 그 자체라 저장 전 재확인 불필요
- 종료 시각의 in: startAt... 범위 제약 제거 — 초 단위 하한 근처 선택을 소리 없이 되감던 스냅백 원인. 검증은 종료<시작 빨간 경고 + 저장/추가 버튼 비활성으로 대체 (숨은 보정 제거)
- 편집 상태 분 단위 절사(flooredToMinute) — 실측정 기록의 초 찌꺼기(14:32:47)로 다이얼상 1시간이 "59분"으로 표시되던 어긋남 수정. 저장은 화면 값 그대로
- 검증 인자 신설: -recordShowEditor session|count(기록 탭 최신 기록 수정 시트), -recordAddFor "이름"(모음 탭 기록 직접 입력 시트)
- l10n: 경고 문구 1키 ko/en/ja, 카탈로그 missing/stale 클린. CLAUDE.md §6.5·§14 갱신
- 검증: Debug/Store 두 스킴 빌드, 수정·추가·횟수 시트 시뮬 스크린샷, -progressSelfTest 37건 ALL PASS

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-17 23:08:09 +09:00
songyc macbook
a881646b49 docs(claude): v2.2 — session handover refresh for a fresh start
- 문서 버전 v2.2(2026-07-17)로 갱신
- §1 현재 상태: 동결 이후 수정 라운드 전부(실기기 확인 완료 포함)·Marketing/ 자료 완비·사업자 등록/통신판매업 대기·버그 대응 루틴을 한 행으로 집약 — 새 세션이 이 행만 읽어도 현 시점 파악 가능
- §2.2: 마케팅 스크린샷용 시뮬레이터 4종 UDID 추가 + 운영 함정 2건 명시(xcodebuild 병렬 실행 시 위장 실패, install 직후 launch의 런치 인자 무시)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-17 21:14:15 +09:00
songyc macbook
c0aef1271c docs(marketing): framed promo screenshots (24) + compositor tool
- 홍보 문구 합성판 추가 — 브랜드 배경(웜 화이트→그린 그라데이션) + 헤드라인/서브 문구(ko/en/ja, 화면별 8종) + 골드 포인트 바 + 둥근 모서리 카드(그림자·헤어라인)로 합성. 캔버스는 ASC 규격 그대로(1320×2868 / 2064×2752)라 framed 세트를 바로 업로드 가능 — 원본 세트는 예비·재합성 소스로 유지
- Marketing/tools/frame_screenshots.swift — AppKit 기반 합성 도구(재현 가능): 문구·색 상단 정의, 텍스트는 폭 맞춤 자동 축소, 원본 재촬영 후 재실행만 하면 됨. 워치는 캔버스가 작아 원본 유지(관행)
- README: framed 우선 업로드 안내 + 문구 오버레이 규정 메모 + iPad 상태바 날짜(시뮬 시스템 언어) 알려진 티 기록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-17 18:07:19 +09:00