84 Commits

Author SHA1 Message Date
songyc macbook
a9b7a6c5d2 polish(1.5-p13): 출시 전 최종 점검 — 1.5 추가 문자열 241건 전수 검수·번역 3건 수정·키워드 보강
1.4 기준 커밋 대비 카탈로그 추가 키 241건(IOS 170·위젯 35·워치 20·InfoPlist 2·워치위젯 14)
전수 번역 검수 + whats-new·프로모션·설명·신기능 팝업·도움말·스크린샷 세트 누락 점검:
- 워치·워치위젯 ja 용어 통일: 컴플리케이션 설정 설명 '表示する行動' → '表示するアクション'
  (용어 규칙 행동=アクション 위반 2곳 — 유일한 규칙 위반)
- 신기능 팝업 en 자연화: "tap it to act right away" → "tap it to run the action right away"
- keywords.txt 1.5 보강: ko +건강,수면,걸음(88자)·ja +ヘルスケア,睡眠(95자), 기존 무삭제
  (en은 97/100자로 여유 없어 유지 — ASC 각 로케일 키워드 란에 새로 붙여넣기 필요)
- 그 외 누락 0 확인: whats-new·설명·팝업 6항목·도움말(일기=전 기기, 건강=지원 기기 분기)
  모두 1.5 기능 인벤토리와 일치, 스크린샷 원본 57+합성 63장 완비, 인텐트 메타데이터
  'iPhone' 단어 금지 재확인, InfoPlist 건강 문구 3언어 확인

검증: 전 카탈로그 missing/stale 0, iOS Debug·Store·워치 빌드 그린, en 팝업 실렌더 확인.
빌드 번호 9 유지.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-26 15:05:26 +09:00
songyc macbook
efe38cb25b fix(1.5-p12): 워치 미니 행동 화면 재구성 — 하단 버튼 잘림 해소, 아이콘=실행 버튼 (빌드 9 동일)
사용자 울트라 실측: 컴플리케이션 착지 화면의 하단 실행 버튼이 아래가 살짝 잘림.
- 하단 버튼 제거, 아이콘 타일이 실행 버튼 (우하단 +/▶/■ 배지, 측정 중=노란 테두리+배지)
- 상태별 한 줄 힌트("아이콘을 누르면 시작/종료/1회 추가") — ja 40mm 한 줄 유지(축소 0.75)
- 작은 워치(높이<220pt) 컴팩트 메트릭 — 40mm에서도 힌트까지 스크롤 없이 한 화면
- 실행 경로는 기존 store.run 그대로(햅틱 포함), a11y 라벨은 기존 버튼 문구 유지
- 도움말 '행동 기록 컴플리케이션' 문구 갱신(3언어), 전 카탈로그 missing/stale 0
- 신규 검증 인자 -watchSeedSnapshot(페어링 없는 합성 스냅숏)·-watchOpenActionIndex

검증: 49mm(울트라)·46mm(26.2)·40mm(11.5) × 3상태 + ja 스크린샷 잘림 0,
워치·iOS Debug·Store 빌드 그린. 스키마·빌드 번호 무변경(9 — ASC 업로드 전).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-26 14:53:03 +09:00
songyc macbook
8b1236d6a9 feat(1.5-p9): 건강 다짐 표시 색 — Quest.healthColorHex(기본 분홍=빈 값), 편집기 색 선택, 빌드 7
- targetColor 건강 분기: 빈 값=시스템 분홍(다크 적응), 지정 시 hex — 단일 지점이라 목표 탭·모음·일기·위젯·워치 자동 반영
- 편집기 건강 섹션 '다짐 색'(프리셋 12+피커), 저장 시 기본색은 ''로·행동/꼬리표 전환 시 '' 정규화
- 타임테이블 블록 색과 별개, 시드 걸음 다짐에 #3E7CB1(대비 렌더 검증+스키마 내보내기 트리거)
- QA: 일기 목표 카드에서 걸음=파랑·나머지=분홍 대비 실측, 편집기 렌더, 61건 ALL PASS, 3종 빌드 그린, l10n 0/0
- ⚠️ CloudKit 스키마 추가 — 콘솔 Deploy가 빌드 7 설치보다 선행 필수(CLAUDE.md·plan §12 후속 3)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-23 11:18:57 +09:00
songyc macbook
8b1bc44f67 fix+feat(1.5-p7): 소킹 실측 2건 수정 + 추가 2건 — 빌드 5
- fix: 더보기 탭 일기 달력 날짜 탭 무반응 — morePath [AppTab]→NavigationPath(Date 푸시 가능), 회귀 인자 -morePushDiaryToday(착지 실측)
- fix: 수면 블록이 수면 단계별로 칸칸이 갈라짐 — 10분 이하 깸 병합(sleepDisplayMergeGap, 표시 전용·값 무영향)
- feat: 기록 탭 타임테이블(하루·주간)에 수면·운동 블록 — 단일 공급 지점·숨김 토글 공유, 내보내기 injectingHealthBlocks(forDayKeys:)+trim 확장
- feat: 타임테이블 표시 색 설정(설정→건강 데이터 — 기본 인디고·주황, 전 타임테이블·내보내기 공통), -healthColorPreview
- QA: 주간 6일 블록 렌더·커스텀 색 픽셀 검증(#FF2D55→(255,221,228))·색 설정 화면·Date 푸시 착지, l10n 0/0, Debug/Store 그린

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 23:24:13 +09:00
songyc macbook
0a55b45515 feat(1.5-p6): 소킹 중 추가 5건 — 아이폰 일기 탭·일기 건강 카드·타임테이블 수면/운동 실구간·수면 표시 구간(요일별)·맥 필터 안내, 빌드 4
- 아이폰 일기 개방: AppTab.phoneCases·radialOrder, '그리기' 토글(손가락)·가로 도구줄, 일기 잠금 설정 전 기기
- 건강 카드: DiarySection.health(목록 끝), DiaryHealthCard(지표 선택 공용화·타일 상속·맥 숨김), 인쇄 요약 동승
- 타임테이블 실구간: HealthIntervals 캐시(App Group 400일, CloudKit 금지), injectingHealthBlocks(수면 인디고·운동 주황), 필터 '건강 데이터' 토글+맥 안내
- 수면 표시 구간: SleepWindowPrefs(전체+요일별), 평문 sleep 키=유효 구간 값, 백필 서명 매핑 포함, 새 수면 다짐 기본값 시드
- 실측 수정: 일기 목표 카드 건강 다짐 값 단위, ja 건강 칩 말줄임
- 검증 61/20/27/10 ALL PASS·3종 빌드·카탈로그 0/0·시각 QA 10여 장(26.5/18.5/맥 분기)
- 마케팅: 06-bubble 재촬영, 10-week→10-diary 교체, 아이패드 03 재촬영(3언어), whats-new/설명 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 21:56:57 +09:00
songyc macbook
1f7c4d4b82 chore(1.5-p5a): 버전 1.5(1)·스토어 텍스트·PRIVACY 건강 문단·촬영 준비
- MARKETING_VERSION 1.5 / 빌드 1
- whats-new-1.5(3언어)·promotional-text-1.5(이용자 6명 감사 스토리)·설명 3언어에
  건강 타일(무료 절)+건강 다짐·행동 컴플리케이션(프리미엄 절) 반영
- PRIVACY.md: 권한 표에 건강(HealthKit) 행 + 읽기 전용·서버/iCloud 미저장 문단(ko/en/ja — 5.1.3)
- frame_screenshots: 09-records→09-health 카피 교체, seedHealthQuest 목표 제목 현지화(+카탈로그 manual)
- 극한 검증: 실버전(1.5) 업그레이드 경로 팝업 자동 표시 확인, 벌크 1만건+건강 결합 렌더 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 06:34:27 +09:00
songyc macbook
9929e6631e feat(1.5-p4): 신기능 소개 팝업 + 도움말 전면 자연화·신규 주제 3개 + l10n 전량 완역
- WhatsNewView(버전당 1회·신규 설치 시드·온보딩 우선·全기기 업데이트 안내·-showWhatsNew)
- HelpView: 전 주제 ko 자연화(오타 '남긴 하지만'·번역투·'완료 보관함'→'완료된 목표' 정정,
  1.1 맥 일기 반영), 신규 주제 3개(행동 컴플리케이션·건강 보기·건강 다짐), 건강 그룹은
  지원 기기에서만 노출
- l10n: 4개 카탈로그 sync·en/ja 신규 208건+본문 재번역·용어 통일(Action/アクション·
  Quest/クエスト·Home/ホーム)·stale 43 청소 → 전 카탈로그 missing/stale 0,
  InfoPlist에 NSHealthShareUsageDescription 3언어
- 검증: Debug/Store/워치 빌드, 자가 검증 61·20·27·10 ALL PASS, ja 도움말 실렌더 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 06:28:11 +09:00
songyc macbook
16e8737976 feat(1.4-b3): '일기만' 정리 옵션·라디얼 FAB 가림 수정·1.4 전용 프로모션 — 빌드 3
- 데이터 정리·초기화에 '정리할 데이터' 축(기록과 일기/일기만) 추가 — 일기만은 기록·구조·양식 보존, 백업은 일기 PDF만, DataReset.deleteDiaries(전체/날짜까지)
- 자가 검증 18→27건(일기만 9건: 기준일 포함 삭제·기록/행동/양식 보존·cascade) — 26·18.5 심 ALL PASS
- 라디얼 모드 FAB가 목록 마지막 행을 가리던 실측 문제 수정 — 탭 루트(NavigationStack 안쪽) 하단 safeAreaInset 78pt, 26·18.5 시각 확인
- 도움말 '데이터 정리·초기화'에 일기만 문구, 신규 12키 en/ja 완역(카탈로그 missing/stale 0)
- whats-new-1.4에 일기만 반영 + promotional-text-1.4.txt 신설(ko 154/en 169/ja 139자 — 이용자 3명 감사 멘트)
- iOS 18.5 심층 QA: 자가 검증 106건 ALL PASS + 라디얼/위젯/초기화 화면 확인
- CURRENT_PROJECT_VERSION 2→3, Debug/Store/워치 3빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-12 02:19:34 +09:00
songyc macbook
22ed06f2a1 feat(1.4-b2): 도움말 재구성·워치 햅틱 상향·빌드 번호 2 — TestFlight 재업로드 준비
- 도움말 뭉친 주제 3곳 분리: '데이터 정리·초기화'(CSV 주제에서)·'지난 7일·30일로 보기'(비교 주제에서)·'사진·도형·텍스트 꾸미기'(펜슬 주제에서) 독립 — 비교·CSV 주제는 단일 기능 설명으로 복귀
- 도움말 이미지 18장 전수 실사: 코드 참조 6종×ko/en/ja 완전 매칭·고아/누락 0, ko·en 실렌더로 언어별 이미지 로딩 확인
- 신규·재구성 문구 8건 en/ja 완역(기존 번역 재조합으로 품질 유지), stale 3키 청소 — 전 카탈로그 missing/stale 0
- 워치 행동 실행 햅틱 .click→.success(가장 강한 축) — 실사용 '너무 약함' 보고 반영
- CURRENT_PROJECT_VERSION 1→2 (TestFlight 1.4(2))
- 동기화 삭제 전파 재확인: 컨텍스트 경유 개별 삭제라 CloudKit로 전 기기 전파(의도된 설계·경고 문구 존재)
- 검증: Debug/Store/워치 3빌드 성공, 자가 검증 49+20+18 ALL PASS 재확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-12 00:11:36 +09:00
songyc macbook
62fa1a2d68 feat(report): 정리 리포트에 '목표별 다짐' 표 추가 — 검수 발견 C 해소
- 그룹=목표, 행=다짐(대상 아이콘·이름 + 주기 scheduleLabel[마감 시각 포함] + 목표량·방향 '3회 이상 달성'/'1시간 이하 유지')
- 페이지 분할은 목표 그룹 단위(한 목표의 다짐이 페이지에 찢어지지 않음)
- 신규 키 '목표별 다짐' en/ja 완역, 나머지는 기존 키 재사용 — 카탈로그 missing/stale 0 유지
- 벌크 1만 건(4페이지 스티치 1290×11042)·소량(iPad) 실물 검사 통과, Debug/Store 빌드 성공
- 검증 중 'Documents 산출물 0개' 소동은 macOS NFD 파일명 대 grep NFC 불일치 착시로 판명 — 코드 무결

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-11 18:36:44 +09:00
songyc macbook
e4fcf21b27 chore(release): 1.4 마무리 — l10n 전 카탈로그 완역·버전 1.4·whats-new·도움말·CLAUDE.md v2.7
- l10n: IOS 67·Widgets 4 신규 문자열 en/ja 완역, stale 4키 청소 — 전 카탈로그 missing/stale 0
- 도움말 3주제 갱신(통계 롤링·데이터 정리·일기 내보내기 후 삭제)
- MARKETING_VERSION 1.4(빌드 1, 8구성) + Marketing/AppStore/whats-new-1.4.txt(ko/en/ja)
- CLAUDE.md v2.7: 하한 18.0·1.4 전 기능·신규 검증 인자 9종·18.5 QA 심 반영
- 통합 QA: Debug/Store/워치 빌드 성공, 자가 검증 49+20+18+10 ALL PASS(26 심), 18.5 심에서도 49+18 ALL PASS+화면 렌더, en 로케일 렌더 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-11 17:25:35 +09:00
songyc macbook
e6b721e368 feat(diary): 도형·텍스트 상자 UX 2차 개편 — 종류별 모양 손잡이·스냅·제자리 텍스트 입력
실사용 보고: 도형이 고정 비율 손잡이 하나뿐이라 모양을 다듬을 수 없고,
텍스트는 시트에 입력하는 방식이 일반 노트 앱과 동떨어져 있었다.

- 종류별 모양 손잡이 (드래그는 페이지 좌표계로 받아 실시간 회전에도 안정):
  · 사각형: 꼭짓점 4개 — 끈 모서리만 움직이고 반대편 고정
  · 원: 상하좌우 4개 — 늘리고 눌러 타원 만들기
  · 선·화살표: 양 끝점 — 반대 끝 고정한 채 길이+방향 동시 조절
  · 사진·텍스트: 우하단 1개 (사진은 원본 비율 유지)
- 정사각형·정원 스냅: |가로-세로| ≤ 10pt면 딱 맞추고 손잡이·테두리
  노란색 강조 + 햅틱. 핀치는 모양 비율 그대로 균등 스케일
- 텍스트 상자 제자리 입력: 선택된 상자를 탭하면 그 자리에서 키보드
  입력·줄바꿈 (생성 직후에도 바로 입력). '글 수정' 시트는 '스타일'
  시트로 재편 — 테두리 켬/끔 + 독립 테두리 색(borderColorHex,
  빈 값 = 글자 색) + 굵기
- borderColorHex 필드 추가 (기본값 — CloudKit·구버전 안전)
- 검증 인자 -diaryTextEdit 추가, 도움말 갱신 + en/ja 번역
- 검증: Debug/Store 빌드, 아이패드 심 손잡이 배치·회전 정합·제자리
  편집 렌더 확인, 카탈로그 missing·stale 0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-03 12:49:03 +09:00
songyc macbook
5aae30983d feat(diary): 도형·텍스트 상자 편집 강화 — 크기 손잡이·자유 비율·회전·스타일 시트
"정해진 모양·크기 그대로만 나온다"는 실사용 보고: 핀치(균등 스케일)만 있어
가로세로 비율·회전·색·굵기를 바꿀 수 없었고 맥(마우스)은 크기 조절 수단 자체가
없었다. 일반 노트 앱 수준의 기본 편집을 채워 넣는다.

- DiaryPageItem 스타일 필드 8개 추가 (전부 기본값 — CloudKit·구버전 데이터 안전):
  heightRatio(자유 비율)·lineWidth·filled·cornerRadius·fontSize·textBold·
  textAlignRaw·textBorder. 0/음수/빈 값 = 기존 하드코딩과 동일한 룩
- 선택 시 오른쪽 아래 크기 손잡이: 도형·텍스트는 가로세로 따로, 사진은 원본
  비율 균등. rotationEffect 안쪽 overlay라 회전 상태에서도 로컬 좌표로 정확
- 두 손가락 돌리기 회전 제스처 + 시트의 회전 슬라이더(마우스·정밀 대체)
- '도형 수정' 시트: 색·선 굵기·채우기(사각/원)·모서리 둥글기(사각)·회전
- '글 수정' 시트 확장: 글자 크기·굵게·정렬(왼쪽/가운데/오른쪽)·테두리(+굵기)·회전
- 내보내기는 DiaryItemView 재사용이라 자동 일치, 시드가 새 필드 전부 렌더
- 검증 인자 -diaryShapeEdit 추가, 도움말 갱신 + en/ja 번역
- 검증: Debug/Store 빌드, 아이패드 심 ko/en/ja 시트 렌더, 기존 스토어 위
  경량 마이그레이션(덮어 설치) 정상

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-03 11:51:08 +09:00
songyc macbook
7475a963bd fix(diary): 양식 페이지 펜 색 라이트 고정 — 다크/라이트 잉크 반전으로 필기가 안 보이던 문제 해소
PencilKit은 획 색을 화면 모드에 맞춰 자동 반전하는데, 양식(PDF·사진)은 항상
밝은 배경이라 다크 모드 아이패드에서 쓴 획이 라이트 모드 맥의 흰 양식 위에서
흰색으로 반전돼 보이지 않았다(동기화 문제로 오인된 실사용 보고).

- 양식 페이지는 캔버스 overrideUserInterfaceStyle + PKToolPicker
  colorUserInterfaceStyle을 .light로 고정 (해석·렌더를 같은 기준으로 묶는 WYSIWYG)
- 양식 없는 페이지는 기존 동적 반전 유지 (다크 배경 종이에선 그게 맞음)
- 내보내기 PKDrawing.image도 라이트 트레잇 고정 — 호출 시점 트레잇 의존이라
  다크에서 내보내면 획이 반전 렌더될 수 있던 잠재 결함 제거
- 도움말 '나만의 양식(속지)' 문구 갱신 + en/ja 번역

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
2026-08-03 11:40:36 +09:00
songyc macbook
0e6804b531 feat(progress): 주기 몫 채운 주간·월간 다짐의 하루 진행률을 '이번 주/달 달성' 상태로 표시
- 주간/월간 '이상 달성' 다짐이 현재 주기 몫을 채우면 하루 게이지가 0% 대신
  완료 상태(게이지 가득+초록 ✓+문구)로 표시 — 목표 탭 행·모음 카드·위젯 ②(체크)·
  ③(문구)·④(링 가득)·시리 하루 응답 공유
- 목표 하루 평균(combinedSpanRatio)에도 해당 다짐을 1.0으로 반영 —
  위젯 ② 목표 바·워치 목표 게이지·시리 목표 응답·일기 헤더 자동 반영
- 판정은 QuestProgress.isPeriodFulfilled 단일 지점 — 기준일의 논리적 하루 끝
  클리핑으로 일기 과거 날짜 소급 차단. spanProgress 수치·판정(judgment)·연속(streak)
  불변(표시 계층 전용). 하루 다짐·특정 기간·atMost는 비대상, 잠금화면·워치
  컴플리케이션은 공간 제약으로 수치 유지
- 도움말 '진행률 읽는 법' 문구 갱신, l10n en/ja 완료(전 카탈로그 stale 0·missing 0)
- 검증: -progressSelfTest 37→49건 ALL PASS(기존 37건 수치 무변경), 신규
  -seedPeriodFulfilled 시드로 ko/en/ja·위젯 실렌더 확인, 시리 스모크 10건 OK,
  Debug/Store 빌드 성공(워치 타깃은 Shared 미포함·무변경)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-08-01 06:45:01 +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
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
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
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
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
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
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
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
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
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
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
e6fc272908 fix(l10n): unify Japanese app name to "Haru Danim" in 10 leftover spots
- 워치 스크린샷 촬영 중 발견: 워치 앱 제목 ja가 옛 표기 'ハルダニム' — 과거 결정(전 타깃 ja 앱 이름 = 'Haru Danim', InfoPlist는 이미 통일)과 어긋남
- 전수 스캔으로 카탈로그 4곳 총 10건 통일: 워치 앱 제목, 워치 컴플리케이션 '하루 다님' 헤딩, 잠금화면 위젯 inline 문구 2종(IOS·위젯 카탈로그 각각), 시리·제어 센터 도움말 본문 3건 — AppShortcuts의 ${applicationName} 해석(Haru Danim)과도 일치하게 됨
- 검증: 전 카탈로그 'ハルダニム' 0건, ja 워치 스크린샷에서 'Haru Danim' 표기 확인, Debug·Store·워치 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-17 02:29:57 +09:00
songyc macbook
39027eeb4a chore(debug): localize demo seed names for locale marketing screenshots
- 데모 시드(-seedDemo·-diarySeed)의 행동·꼬리표·목표 이름과 메모·할 일을 String(localized:)로 — 마케팅 스크린샷을 en/ja 로케일로 찍을 때 한국어 데이터가 박히지 않게 (DEBUG 전용, ko 기본 동작 불변)
- 인텐트 스모크 테스트의 이름 조회도 현지화 경유로 바꿔 어느 로케일에서든 동작
- 신규 17키 en/ja 번역 완비 (카탈로그 783키 missing/stale 0), Debug·Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-17 02:09:36 +09:00
songyc macbook
6880983b54 feat(watch): per-goal opt-in filter for complication list
- 목표 편집에 '애플워치에서 보기' 토글 추가 (iPhone 전용 — 워치가 iPhone과 페어링되므로 iPad에서는 숨김·무의미, 기본 꺼짐) — 목표·다짐이 늘면 컴플리케이션 목록이 폭증하는 문제의 옵트인 해법 (사용자 요청)
- 저장은 기기 로컬 LocalPrefs `local.watchGoals` (§15-3 노출 설정 원칙, pinnedGoals 선례) — CloudKit 스키마 무변경·페이로드 무변경으로 리스크 최소화
- 필터는 WatchSyncManager.makeSnapshot 한 곳: 스냅숏의 목표 = 진행 중 ∩ 체크됨 → 목록(recommendations)·표시 모두 자동 반영, 완료 목표는 기존 진행 중 조건으로 자동 제외. 행동·측정 중 상태(워치 앱 화면·현재 현황·iPad 기록의 동기화 경로)는 필터와 무관 — 지연 추가 0
- 검증(페어링 시뮬레이터 E2E): -watchGoals 1 → 워치 컴플리케이션에 토익 목표+영어 공부 다짐만 표시, -watchGoals 0 → '목표 없음'/'다짐 없음' 빈 상태로 우아하게 처리(크래시 없음), 현재 현황(독서 타이머)은 필터와 무관하게 정상 수신. 아이폰 편집기 토글 렌더 확인. Debug·Store·워치 3스킴 빌드 성공
- 도움말 컴플리케이션 항목 갱신 + 신규 문구 en/ja 완비(카탈로그 766키 클린), §14에 -watchGoals 인자, §5.2/§6.4/§11 문서화
- 주의: 기본 꺼짐이라 업데이트 직후 기존에 페이스에 올린 목표·다짐 컴플리케이션은 빈 상태가 됨 — 목표 편집에서 원하는 목표를 한 번 켜 주면 복구

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 23:48:59 +09:00
songyc macbook
2a176fa8a2 fix(quest): count scheduled days only for daily-quest spans + rest-day state
진행률 검증 보고에서 확정한 결정 반영 (사용자 위임):

- [계산 수정] 하루 단위 다짐의 주/월 집계를 **방향 무관 수행일 기록만** 합산 — 목표량(scaledTarget)이 수행일 수 환산인데 '이하 유지'만 비수행일 기록까지 값에 섞여 분모·분자가 어긋나던 비대칭 해소 (월수금 1시간 이하 다짐이 목요일 시청으로 한도 초과 표시되던 문제). atLeast의 하루 기여 캡·마감 창 클립은 기존 유지
- [표시 수정] 수행일 아닌 날(요일·날짜 다짐의 쉬는 날, 기간 밖 custom)의 '하루' 게이지를 '수행일 아님' 상태로 — 쉬는 날 기록은 주/월 집계에 안 잡히는 값이라 퍼센트(예 133%)로 보여주면 "오늘 채웠다"는 오해 유발. 목표 탭 행·모음 카드(문구+빈 바), 위젯 ③(문구·누적값 숨김)·②(— 대시)·④(링 흐림, 스냅숏 isRestDay), 시리 '오늘' 조회("오늘은 수행일이 아니에요") 공유. 워치·잠금화면 점은 공간 제약으로 수치 유지(문서화)
- [의도 확정·유지] atMost 하루 게이지의 환산 한도 페이스 경고 / 다짐 생성 이전 기록 인정 / 월 경계 주 혼입 / 적용일 없는 달 0% / custom 종료 후 게이지 — CLAUDE.md §4.2에 트레이드오프로 명시
- 검증: -progressSelfTest 37건 ALL PASS(E 비수행일 제외·M 비대칭 수정·N 기간 밖 판정 신규), 목표 탭 스크린샷(달리기 월수금: 하루 '수행일 아님'/주간 0%/월간 7%), 위젯 미리보기 렌더 무결, Debug·Store·워치 3스킴 빌드 성공
- 도움말 '진행률 읽는 법' 전면 보강(수행일 집계·페이스 캡·이하 유지 이분법+하루 경고) en/ja 완비, 신규 키 2종('수행일 아님', 시리 응답) IOS·위젯 카탈로그 클린(763/213키)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 22:59:15 +09:00
songyc macbook
3ae49faad7 fix(quest): cap prorated span display at 100% — weekly quest showed 350% daily
- 보고된 버그: 주 2회 다짐을 목요일에 1회 수행 → 목표 탭 하루 진행률 350% (1 ÷ 주목표 2/7). 주기와 다른 span의 환산 목표는 페이스 가이드일 뿐인데 초과분까지 퍼센트로 표기되던 왜곡
- 수정: spanProgress에서 '이상 달성'이면서 환산 목표 span일 때 값을 목표에서 캡 (usesScaledTarget 분기) — 자기 주기 span(하루 다짐의 '하루' 200% 등)과 특정 기간 다짐(환산 없음)은 초과 표기 유지, '이하 유지'는 값 무캡(UI 초과 판정·페이스 경고 유지). 게이지(ratio)·달성 판정·연속·목표 종료 판정은 원래 캡·별도 경로라 무영향 — 바뀌는 것은 퍼센트 문구뿐
- 검증 도구 신설: -progressSelfTest (DEBUG) — 인메모리 컨테이너에 12시나리오·33검증(보고 케이스, 주간/월간/요일 스케줄/마감/atMost/특정 기간/잔존 deadline/무기록 + 목표 합산 회귀) 구성해 손계산 기대값과 대조, ALL PASS. 설정·날짜 고정이라 언제 실행해도 동일 판정
- 화면 확인: 목표 탭 '꾸준한 달리기'(주 2시간) 하루 233%→100%, 주간 67%·월간 30% 유지, 매일 다짐 117%/133%(자기 주기)·atMost·마감 다짐 표기 불변
- 도움말 '진행률 읽는 법'에 페이스 기준 설명 추가(en/ja 완비), CLAUDE.md §4.2 규칙·§14 인자 기재
- §2.3 l10n 루틴 강화: stringsdata를 Objects-normal/arm64로 한정 — x86_64·Release 등 낡은 구성 파일이 수정 전 문구를 계속 추출시키는 오염 발견·수정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 22:35:23 +09:00
songyc macbook
bdc771455b feat(l10n): localize CSV header row per language
- CSV 열 이름도 언어별 현지화 (파일명 현지화 b17a199의 후속, 사용자 결정) — 스프레드시트에서 열 이름은 곧 UI. 값의 rawValue(time/count, inProgress 등)는 데이터라 언어 무관 유지
- 기존 키 최대 재사용(이름/시각/수량/메모/방향/종료일/꼬리표/즐겨찾기/시작/종료 + '추적 방식' — ko 헤더만 '추적방식'→'추적 방식'으로 공백 하나 추가됨), 신규 10키(행동id/만든날/초/내용/시작일/상태/달성기준%/대상/주기/목표량) en/ja 완비 — 카탈로그 761키 missing/stale 0
- 검증(시뮬레이터 실헤더): en "id,Name,Tracking type,Tags,Favorite,Created" 등 5파일, ja "id,名前,計測方式,タグ,お気に入り,作成日" 등 5파일, ko 회귀 정상. Debug·Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 10:28:53 +09:00
songyc macbook
b17a199b53 feat(l10n): localize export file names per language
- 내보내기 파일명을 언어별로 현지화 — 수신 환경(PC·클라우드·메일)이 한글 파일명을 지원하지 않을 수 있음 (사용자 결정). ko는 기존 그대로("하루다님-기록-…"), en/ja는 라틴 접두 "HaruDanim-" + 그 언어의 종류 단어 (History/記録, Diary/日記, Stats/統計, Actions/アクション 등)
- 대상 전부: 기록·통계 리포트 PNG(ExportSnapshot.fileName + 슬러그 3종), 일기 PDF·스티치 PNG(슬러그 3종 포함), CSV 5종(행동·목표·다짐은 기존 키 재사용, 시간기록·횟수기록 신규 키). CSV 헤더는 데이터로 보고 한국어 유지
- 카탈로그 신규 11키 en/ja 완비(751키 missing/stale 0), CLAUDE.md §7에 규칙 기재
- 검증(시뮬레이터 실파일명): en CSV 5종 "HaruDanim-Actions/TimeRecords/CountRecords/Goals/Quest.csv", en 리포트 "HaruDanim-History-2026-07-16.png", iPad en 일기 "HaruDanim-Diary-2026-07-15~2026-07-16.pdf"(기간 슬러그), ko 회귀 "하루다님-행동.csv" 등 5종 그대로. Debug·Store 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 10:22:01 +09:00
songyc macbook
2b6ca94f09 docs(help): add short-session-ignore and note-prompt topics
- 모음 탭 그룹에 도움말 2개 추가: '짧은 기록 무시'(측정 시작·종료 다음 — 3초~1분 기준, 위젯·워치·시리 종료에도 적용됨을 안내), '기록에 메모 남기기'(길게 누르기 메뉴 다음 — 행동별 토글·건너뛰기·기기 로컬 저장·기록 탭 노란 표시·수정 시 메모 편집 안내)
- 새 문자열 3키 en/ja 번역 채움 (설정 항목명은 기존 카탈로그 번역 'Ignore short sessions'/'Show note prompt when recording' 그대로 인용, 제목 '짧은 기록 무시'는 기존 키 재사용)
- 검증: -helpPreview ko/en 스크린샷 — 두 주제 모두 의도한 위치에 렌더

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-16 02:53:43 +09:00
songyc macbook
6a486a4fbd feat(quest): daily quest deadline time — clip the day's measurement window
하루 단위 다짐에 '마감 시각까지만 집계' 옵션 추가 (최소판 설계):

- 모델: Quest.deadlineMinutes(-1=없음) 필드 1개 — CloudKit 안전(기본값), 주기가
  하루 단위가 아니면 값이 남아도 무시(hasDeadline이 주기·범위를 함께 검사)
- 의미론: 마감 = 그날 집계 창의 끝. dayMeasurementRange(forKey:) 단일 구현을
  주기 범위(current/judgment)·주/월 span 하루 루프(spanValue)·연속 버킷팅
  (perDayValues)·위젯 누적 라벨(spanRawValue)·일기 카드가 공유한다.
  원본 기록은 불변 — 마감 뒤 기록은 남되 그 다짐에만 미집계. 시간형은 기존
  겹침 클리핑이 마감을 걸친 세션을 부분 인정(추가 코드 0). '이하 유지'는
  마감까지 한도 안이면 그날 달성으로 고정.
- 경계 규칙: 마감은 그 논리적 하루(24h) 안에서 그 시계 시각의 등장 지점 —
  하루 시작보다 이른 시각은 다음 달력일 새벽, 시작과 같은 시각은 +24h(온전한
  하루)로 0길이 창이 수학적으로 불가능(에디터 검증 불필요, 오류 상태 없음)
- 의도된 최소화: '마감 지남' 전용 표시 없음(게이지 값이 마감 시점에 연속이라
  위젯 타임라인 마감 경계 불필요 — 위젯·워치·시리는 코드 변경 0으로 자동 일관),
  연속 달성은 값 클리핑만(오늘 놓친 끊김 반영은 내일부터 — 유예 규칙 유지),
  주간/월간/기간 마감은 미지원
- UI: 다짐 에디터 토글+시간 선택(하루 단위만, footer 설명), 주기 문구에
  "· 오전 8:00까지" 표기(목표 탭·시리 요약·CSV 자동 반영), 일기 카드
  "하루 목표 · 오전 8:00까지", 도움말 항목 추가, ko/en/ja 번역
- 검증: seedDemo에 마감 다짐 시드(창 안/밖/어제 실패 케이스) — 하루 100%
  (창 밖 기록 포함 시 200%가 되는 함정 통과), 주간 29%(=2/7)·월간 6%(=2/31)
  수기 계산과 정확 일치, streak-dump 연속 1일(어제 실패로 끊김) 확인,
  마감 없는 다짐 전부 기존 수치 유지(경로가 hasDeadline 가드로 완전 동일),
  일기 카드 1회/1회(원본 합계는 그대로), 영어 로케일 "By 8:00 AM" 렌더,
  Debug·Store 빌드 성공, 카탈로그 9종 missing/stale 0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-15 17:52:18 +09:00
songyc macbook
3f518aa91b chore(l10n): purge stale catalog entries + per-target stringsdata sync routine
전체 코드 점검 중 발견한 번역 카탈로그 정리:
- IOS 카탈로그의 stale 항목 2건 삭제 — "다른 행동 %lld개도 함께 추적 중"은
  위젯 타깃 전용 문자열(위젯 카탈로그에 번역 완료 상태로 존재)이고,
  "프리미엄 상태 (테스트)"는 DEBUG 전용 문구
- DEBUG 프리미엄 토글 라벨을 Text(verbatim:)으로 — 개발용 문구는 카탈로그로
  추출하지 않는 컨벤션(§15-6)에 맞춤 (같은 섹션의 다른 문구와 동일)
- CLAUDE.md l10n 루틴 수정: 카탈로그마다 자기 타깃의 stringsdata만 sync하도록
  경로 필터 추가 — 전 타깃을 한꺼번에 넣으면 위젯 전용 문자열이 IOS 카탈로그에
  미번역으로 재유입되던 오염의 근본 원인 제거 (이번 stale의 발생 경로)

검증: 전 카탈로그(9개) missing/stale 0건, 카탈로그 의미 diff = stale 2건 삭제뿐
(번역 변경 없음), Debug·Store 스킴 빌드 성공

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-15 15:52:10 +09:00
songyc macbook
aa1c098d98 chore(l10n): Xcode re-save of string catalog — formatting + stale marks
- 키 정렬/공백 스타일 정규화 (Xcode 자동 재저장)
- 미사용 문자열 2건에 extractionState: stale 표시
- 번역 내용 추가/삭제 없음

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 02:56:13 +09:00
songyc macbook
9c9c24f7df feat(a11y): VoiceOver labels for icon-only buttons + combined action-cell narration
접근성 감사 ③ — 전 화면의 아이콘 전용 버튼과 텍스트 없는 시각
요소에 보이스오버 라벨 부여 (시각 UI 변화 없음):

- 모음 탭: 행동 버튼 셀을 label(이름)+value(측정 중/오늘 누적)로
  한 덩어리 낭독 — 아이콘·타이머가 따로 읽히지 않음. 진행 중 행의
  정지 버튼 "측정 종료".
- 기록 탭: 날짜 이동 화살표(이전/다음 날짜), 내보내기, 기록 필터,
  필터 칩 해제 버튼. 타임테이블의 색 블록·횟수 점은 "행동 이름 +
  시각(구간)" verbatim 라벨로 낭독 가능하게.
- 통계 탭: 기간 이동 화살표(이전/다음 기간), 내보내기, 통계 필터,
  필터 해제.
- 행동/꼬리표/목표 탭: + 추가 버튼(행동/꼬리표/목표 추가), ⋯ 메뉴.
- 일기: 달 이동 화살표(이전/다음 달), 내보내기, ⋯ 메뉴, 기분 타일
  ("오늘 기분"), 할 일 삭제 버튼.
- ⑥ 현재 진행 중 위젯: 종료 버튼 "측정 종료".
- CLAUDE.md §15에 컨벤션 추가: 아이콘 전용 버튼 accessibilityLabel
  필수, 복합 셀은 label+value 한 덩어리, 텍스트 없는 시각 요소는
  verbatim 라벨.

신규 문구 9종 ko/en/ja 번역 + 위젯 카탈로그 '측정 종료' 번역 복사
(전 카탈로그 missing 0/stale 0). Debug·Store 빌드 성공, 접근성
수식어는 시각 렌더링에 영향 없음(스모크 런치 확인). 실기기에서
보이스오버 켜고 핵심 흐름(행동 시작/종료·날짜 이동) 낭독 확인 권장.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-14 22:24:21 +09:00
songyc macbook
09d0b86ebc feat(premium): privacy policy + terms links on the paywall (review guideline 3.1.2)
배포 잔여 ①-(1) 처리 — 자동 갱신 구독 심사 필수 요건:

- Docs/PRIVACY.md 신설: 개인정보처리방침 ko/en/ja 3개 국어.
  핵심 내용 — 개인정보 수집 없음(서버·계정·광고·분석 SDK 없음),
  모든 데이터는 기기 + 사용자 본인의 iCloud 비공개 DB에만 저장
  (개발자 접근 불가), 결제는 App Store 처리, 권한(캘린더·사진·
  알림) 용도 명시, 데이터 삭제 방법, 문의처 songyc.eng@gmail.com.
  → github.com/notalentprogrammer/HaruDanim 저장소 main 브랜치에
  PRIVACY.md로 업로드하면 앱에 박힌 링크가 활성화된다.
- 결제 화면(PremiumView)에 '약관과 정책' 섹션 추가:
  개인정보처리방침(위 GitHub URL) + 이용약관(Apple 표준 EULA —
  커스텀 EULA 미제공 시 자동 적용되는 표준 계약으로 갈음, 3.1.2 허용).
  외부 링크 화살표 표시, 신규 문구 4종 ko/en/ja 번역.
- CLAUDE.md §1 배포 잔여 갱신 (남은 코드 측 작업은
  ITSAppUsesNonExemptEncryption 1건, ASC 등록 시 앱 설명에도
  두 링크 기재 + 앱 개인정보 보호 '데이터 수집 안 함' 선택 메모).

검증: Debug·Store 빌드 성공, iPad 시뮬레이터 결제 화면에서
섹션·링크·푸터 표시 확인. 카탈로그 missing 0 / stale 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-14 21:43:04 +09:00
songyc macbook
f70e6a1c06 fix(goal,watch,diary): judge goals as of their end date + watch l10n + template render polish
전체 재분석에서 확정한 4건 + 양식 개선 2건:

1) 목표 자동 판정 기준 시점 (핵심 수정)
   기존에는 판정이 "실행되는 시점의 현재 주기" 기준이라, 종료일
   며칠 뒤에 앱을 열면 목표 기간 밖의 데이터로 달성/미달성이
   갈렸다. 이제 자동 판정(evaluateIfEnded)은 **종료일이 속한
   논리적 하루의 마지막 순간**(judgmentReference) 기준 — 늦게
   실행해도, 종료일을 과거로 고쳐도 종료일까지의 기록으로 판정.
   (하루 시작 시간 설정으로 기준이 미래가 되는 경우 now로 상한)
   수동 종료는 종료일 없는 목표 전용이므로 기존대로 "지금" 기준.
   목표 편집 시 종료일 변경 처리: 진행 중 목표는 저장 즉시 판정,
   완료된 목표의 종료일을 바꾸면 '진행 중'으로 재개 후 재판정
   (미래/없음 → 진행 중 복귀, 다른 과거 날짜 → 그 시점 기준 재판정).
   검증: -endGoalYesterday로 어제 종료 → 종료일 기준 '달성' 판정 확인.

2) 워치 컴플리케이션 지역화 2건
   - 다짐 달성률 rectangular의 기간 라벨("하루/주간/월간")이 String
     파라미터라 미추출 → en/ja에서 한국어 노출 → String(localized:)
   - 빈 상태 문구("목표 없음"/"다짐 없음") 동일 문제 → 추출 + 워치
     앱/워치 위젯 카탈로그에 en/ja 번역 추가 (타깃별 stringsdata로
     sync — 카탈로그 오염 없음, 전 카탈로그 missing 0)

3) 배포 체크리스트: CloudKit 프로덕션 스키마 배포 항목을 CLAUDE.md
   §1에 추가 (DiaryTemplate 등 새 레코드 타입은 출시 전 대시보드
   Deploy Schema to Production 필수)

4) 일기 양식 렌더 개선
   - 첫 렌더 비동기화: 저장된 썸네일을 플레이스홀더로 즉시 깔고
     본 렌더(2×)를 백그라운드로 — 복잡한 벡터 PDF도 페이지 넘김이
     걸리지 않음
   - 비활성 페이지 고해상도 강등: 화면 밖 페이지는 래스터를 2×로
     상한(allowsHighResolution) — TabView가 이웃 페이지를 유지해도
     양식 여러 장의 메모리 사용을 절약, 활성 복귀 시 원래 배율 복원
   검증: 양식 페이지 2× 프로그램 줌에서 점 노트 선명(회귀 없음),
   시드 필기 페이지 획 유지 확인.

빌드: Debug·Store·워치 스킴 모두 성공. 도움말(목표 판정 문구
갱신 — 종료일 기준·재판정 규칙 안내)과 CLAUDE.md §4.3 갱신,
문구 수정 stale 1건 삭제 및 ko/en/ja 번역 완료.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-14 19:44:02 +09:00
songyc macbook
bdb97e3c9f feat(diary): imported page templates — PDF/photo backgrounds with per-page picker
일기 노트 페이지 양식(속지) 기능 (합의된 설계 그대로):

- 모델: DiaryTemplate 신설(원본 externalStorage — 여러 쪽 PDF도
  통째 1개만 저장 + pageCount) + DiaryPage.templateID/
  templatePageIndex(기본값 있는 새 필드, uuid 문자열 참조 —
  CloudKit 규칙·동기화 순서에 안전). 스키마에 등록.
- 양식 관리: 달력 툴바에서 진입 — PDF(파일, ≤20MB)·사진 가져오기,
  이름 변경·삭제(사용 중 페이지 수 경고 → 빈 캔버스 폴백, 필기 보존),
  첫 쪽 썸네일 저장. 쪽 상한 24쪽(초과분 안내).
- 페이지 추가: 양식이 있으면 [빈 캔버스/줄 노트/내 양식] 선택 시트,
  여러 쪽 PDF는 2단계 쪽 썸네일 선택(지연 생성). 양식이 없으면
  기존처럼 즉시 추가 — 흔한 경로의 반응성 유지.
- 렌더: 페이지 논리 좌표(768×1024)에 aspect-fit — 필기 좌표계 불변.
  PDF는 벡터 원본을 보존하고 줌 종료 시 현재 배율로 백그라운드
  재래스터(펜슬 캔버스 선명도 훅에 함께 연결 — 확대해도 흐림 없음).
  이미지는 가져올 때 긴 변 3072px 리샘플(필기 래스터 상한 3×와 동일).
  양식 페이지는 줄 노트 토글 숨김(상호 배타), 양식만 깔린 페이지도
  작성함 취급(hasContent). PencilKit 캔버스 코드는 건드리지 않음.
- 내보내기(PDF/PNG)에도 양식 배경 동일 반영.

검증(iPad 시뮬레이터, -diarySeedTemplate 등 신규 DEBUG 인자):
양식 관리·페이지 선택 시트·양식 페이지 렌더(2× 프로그램 줌에서
점 노트 선명) 스크린샷 + 이미지 내보내기 산출물에 양식 포함 확인.
Debug·Store 빌드 성공, 신규 문자열 22종 ko/en/ja(missing 0).
도움말 '나만의 양식(속지)' 항목 추가, CLAUDE.md §3·§6.7·§14 갱신.

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