2026.04.23 작업일지 v1.0.0
한줄일기를 실기에서 확인한 뒤 “이대로 한번 출시해볼까?” 한마디에 발동된 하루. 개인정보처리방침·스토어 메타·시뮬레이터 스크린샷까지 단일 세션에서 마감.
오늘의 궤적
07:15 /sync 에서 시작해 launchd 오작동 오해를 풀고, 병원 todo 드롭으로 “일상생활은 todos 에 쓰지 않는다” 경계를 확정. 08시부터 포모도로 aab 빌드(Closed Testing 대비) 와 한줄일기 UI 폴리싱(3커밋) 을 병행. /irun 으로 아이폰 실기 확인 직후 강대종님이 “이대로 한번 출시해볼까?” 라고 묻자 오후 내내 한줄일기 스토어 출시 준비 (개인정보처리방침 → 메타 ko/en → 시뮬레이터 스크린샷 3장) 까지 몰아서 마감. 총 세션 ~10시간, 공통 저장소에 13개 커밋 누적.
/sync 와 launchd 오해 풀기
07:17 Stop hook 이 ⚠️ 커밋 누락 감지 — 다음 응답에서 정리하세요 / === launchd NOT LOADED === / com.claude.daily-sync-and-learn 를 띄웠다. 처음엔 “어젯밤 이후 자동 실행이 빠진 거 같은데 복구해드릴까요?” 하고 launchctl bootstrap 을 바로 실행했는데, 강대종님이 곧바로 “2번은 내가 진행하려다가 뺐어 수동으로 하기로 진행함” 이라고 정정.
즉시 launchctl bootout 으로 원복 후 feedback_confirm_before_launchctl.md 메모리에 “launchctl 상태 변경은 사전 확인 필수” 로 기록. 이어서 강대종님이 “아 부팅 시에 자동 로드” 라고 정리 → plist 는 ~/Library/LaunchAgents/ 에 그대로 두고, 다음 재부팅 시 자연스럽게 복구되는 A(반자동) 안 으로 확정.
핵심 오해 포인트: launchd 의 StartCalendarInterval 은 컴퓨터가 꺼져있던 시간은 catch-up 하지 않는다. 맥이 06:45 에 꺼져있었으면 그날 자동 sync 는 그냥 스킵. 이건 정상이다.
병원 todo 드롭과 “일상생활 금지” 경계
07:53 강대종님이 ”🏥 공덕M 재활의학과 왼쪽 팔꿈치 진료” todo 를 “todo 에서 빼주세요 드롭 (일상생활 기록x)” 이라고 요청. 기본 /todo 규칙은 “하드삭제 금지, 취소 섹션 이동” 이지만, todos 는 공개 페이지 /cancelled.html 로 파싱되어 퍼블릭 노출되는데 개인 건강 정보를 공개 페이지에 남기는 건 부적절 하다고 판단 → 하드삭제 처리.
후속 조치:
~/todo/todos.md에서 해당 라인 완전 제거 (b5f70d5)- macOS Reminders “Claude” 목록에서도 해당 항목 삭제
~/daejong-page/todos/2026-04-23.md스냅샷 새로 생성 + index.json 업데이트 (69425f8)feedback_no_daily_life_in_todos.md메모리에 “병원/약속/쇼핑 등 일상생활 항목은 todos 에 추가하지 말 것. 오입력 시 하드삭제 허용” 규칙 기록
포모도로 aab 빌드
08:00 ~/apps/pomodoro clean release 빌드 완료 — fvm flutter 3.41.7, 1분 6초, MaterialIcons 트리셰이킹 정상(1645KB → 2KB). 결과물 ~/Downloads/pomodoro-1.0.0-1.aab (43 MB). 파일명은 lessons 규칙대로 name-version-build.aab (+ 기호 금지).
Play Console 업로드는 수동 웹 UI 필요 (첫 앱 등록 + App content 설문). 자동화 가능 구간은 python3 ~/.claude/automations/scripts/play-upload.py --app pomodoro 한 줄로 internal 트랙 업로드 가능한 상태지만, 앱 자체 등록과 설문이 완료된 후에야 동작. 이 단계는 내일로 미룸.
한줄일기 UI 폴리싱 3커밋
dbdc301 — GradientTextStyles + AppSize 토큰화, PressScale, 햅틱
theme.dart에 16개 네임드 스타일 추가:screenTitle,sectionLabel,pillText,moonCaption,moonCaptionWide,prompt,body,soft,faint,aiReply,aiReplySoft,milestoneValue,milestoneLabel,heatLegend,buttonLabel,buttonLabelLgAppSize토큰(buttonH=56, buttonHTall=60, avatarXl=72, moon{Sm,Md,Lg}) 로 기존 매직넘버(54/60/72/14/18/28) 치환- 신규 위젯
common/press_scale.dart: 탭 다운 시 scale 0.97 +HapticFeedback.selectionClick()내장 root_shell탭 전환 햅틱,home_screen엔트리 카드 PressScale 적용,stats_screen히트맵 셀 햅틱
Net diff: 6 파일 ±261/−162. 실제 스크린 코드는 ~303 라인 감소. flutter analyze clean, debug apk 빌드 그린.
1958b9b — SnackBar Undo
- 엔트리 삭제(스와이프/액션시트) 후 나오는 SnackBar 에 “되돌리기” 액션 버튼 추가 (moonGlow 색상)
- 표시 시간 1.4s → 4s 로 확장, 탭하면 삭제한 엔트리를 리스트에 다시 삽입
ab0bca8 — AI 답글 등장 애니메이션
_AiReplyCardStatelessWidget → StatefulWidget +SingleTickerProviderStateMixin- 420ms
AnimationController+ FadeTransition(0→1, easeOut) + SlideTransition(아래 12% → 0, easeOutCubic) 동시 재생 - 첫 프레임 직후
forward()1회 실행 — pending 로딩부터 done 텍스트까지 자연스러운 전환
/irun 실기 확인 → 출시 결심
10:20 /irun hanjul — Xcode 빌드 28초, 설치·실행 4.5초. 실기에서 햅틱·PressScale·AI 등장 애니 확인.
10:25 강대종님 “답변이 AI 스러운데 잘 작동하는거 맞아?” 질문. release 빌드는 HANJUL_PROXY_URL=https://hanjul-proxy.ssamssae.workers.dev/reply 를 통해 GPT-4o-mini 에 실시간 호출 중임을 확인 → 의도된 동작.
10:26 “이대로 한번 출시해볼까?” — 하루 계획 변경. 원래 /goodnight 으로 닫을 예정이었으나, 앱이 충분히 준비된 상태라 출시 준비 3종(privacy / meta / screenshots) 만큼은 오늘 마감하기로 결정.
한줄일기 스토어 출시 준비
1. 개인정보처리방침 (블로커 해결)
한줄일기는 사용자 일기 텍스트를 OpenAI 에 전송 한다. Apple Privacy Nutrition Labels + Google Data Safety 둘 다 이 플로우 공시 필수.
~/daejong-page/privacy-hanjul.html 신규 작성 (97 lines). 포함:
- 데이터 흐름 3단계 (앱 → Cloudflare Worker → OpenAI)
- 수집 항목 명시: 일기 텍스트 + 익명 기기 식별자 (둘 다 분리 저장)
- OpenAI API 보관 정책 링크(30일 남용감지 보관 고지)
- Cloudflare/OpenAI 제3자 제공 명시
- rate limit 정책 (하루 60회/IP, 월간 예산)
- COPPA, HTTPS 보안, 사용자 권리
공개 URL: https://ssamssae.github.io/daejong-page/privacy-hanjul.html (커밋 3fd17bc)
2. 스토어 메타데이터 ko/en
~/apps/hanjul/store/metadata-ko.md + metadata-en.md 신규 (191 lines 합)
- 앱 이름: 한줄일기 / Hanjul — One-Line Diary
- 부제 (iOS): “한 줄 일기, 따뜻한 답글 한 통” / “A line a day, a warm reply”
- 쇼트디스크립션 (Play): “하루 한 줄 일기에 AI가 답글을 보내요. 계정 없음, 광고 없음, 기기 로컬 저장.”
- 키워드: 일기,한줄,감정,AI,다이어리,마음,기록,응원,공감,저널
- 카테고리: Lifestyle 메인 + (iOS) Health & Fitness 서브
- 본문 구조: 훅(“하루 한 줄이면 됩니다.”) → 타겟 4명 → 기능 5개 → 데이터 처리 투명 공개 → 지속가능성(API 예산) → 크레딧
커밋 bba6a6a.
3. 시뮬레이터 스크린샷 3장
iPhone 16 Pro Max 시뮬레이터(iOS 26.2, 1290×2796) 에서 3장 캡처:
- 01-home-loaded.png — 7일 연속 + 엔트리 3개 + AI 답글 (홈 히어로)
- 02-stats-heatmap.png — “한 해의 결” 히트맵 +
12 DAYS · 7 STREAK · 7 LONGEST+ 플라이아웃 - 03-home-prompt.png — 빈 상태 프롬프트 카드 + “한 줄 쓰기” CTA + “아직 기록이 없어요”
촬영 과정에서 예상 못한 함정 2개:
- 시뮬레이터 UI 자동 클릭 불가: cliclick, osascript System Events 둘 다 macOS Accessibility 권한 때문에 탭이 안 먹음 → 대신
root_shell.dart에HANJUL_START_TAB환경변수(기본 0) 추가해서--dart-define=HANJUL_START_TAB=1로 통계탭부터 시작하도록 빌드 변경. 다음부터 스크린샷 찍을 때 재사용 가능한 dev 인프라. - cfprefsd 캐시: 플리스트 직접 쓰기로 시드 데이터 주입했는데 cfprefsd 가 캐시해서 새 데이터를 안 읽음 → 시뮬레이터 shutdown → plist 삭제 → 앱 uninstall → 재빌드 순서로 강제 리셋해야 빈 상태가 반영됨.
시드 스크립트: /tmp/seed-hanjul.py (12일치 + 오늘 포함), /tmp/seed-hanjul-empty.py (오늘 비우기) — 재사용용.
커밋 52ddafa.
인프라·스킬·자동화
feedback_confirm_before_launchctl.md신규 — LaunchAgent 상태 변경 사전 확인 규칙feedback_no_daily_life_in_todos.md신규 — todos 에 일상생활 금지 + 오입력 시 하드삭제 예외MEMORY.md인덱스 2줄 추가root_shell.dartHANJUL_START_TAB dev flag — 기본값 0 이라 무해, 스크린샷 재촬영 시 유용
관련 커밋
| repo | SHA | 메시지 |
|---|---|---|
| hanjul | dbdc301 | refactor: GradientTextStyles + AppSize tokens, PressScale, haptics |
| hanjul | 1958b9b | feat: SnackBar undo action on entry delete |
| hanjul | ab0bca8 | feat: animate AI reply card entrance (fade + slide-up 12%) |
| hanjul | bba6a6a | docs: store metadata ko/en drafts |
| hanjul | 52ddafa | feat: iOS store screenshots (3) + HANJUL_START_TAB dev flag |
| daejong-page | 3fd17bc | feat: privacy policy for 한줄일기 (AI proxy disclosure) |
| daejong-page | 69425f8 | todos: 2026-04-23 — 삭제: 공덕M 팔꿈치 진료 (일상생활 기록 제외) |
| todo | b5f70d5 | todo: 삭제 - 공덕M 팔꿈치 진료 (일상생활 기록 대상 제외) |
| automations | f186152 | report: 2026-04-23-mac.json |
| automations | 7ac8499 | report: 2026-04-23-wsl.json |
심사레이더 v0.2 방향 결정 (18:54)
Gmail 파싱 유지 + UI·알림 다듬기(자기쓰기 단계 계속)로 확정. App Store Connect / Play Console 공식 API 통합은 v0.3 옵션 채널로 연기. 근거: v0.1 실데이터 연동으로 Apple 메일 카드가 S24 에서 정상 렌더링 확인된 상태라 API 통합보다 자기쓰기 사용자 관점의 UX 부채(알림 타이밍·카드 UI·상태 diff·필터) 해소가 먼저 효용이 큼.
남은 작업 (내일 아침)
- Play Console 에 포모도로 앱 생성 + App content 설문 (개인정보처리방침 URL 입력, 광고 없음, 콘텐츠 등급 설문)
- 생성 후
python3 ~/.claude/automations/scripts/play-upload.py --app pomodoro한 줄로 internal 트랙 업로드 - 한줄일기 App Store Connect + Play Console 에 앱 생성 + 설문 (Apple 3.1.1 무관, OpenAI 데이터 공시 필수 — privacy-hanjul 준비됨)
- 쓰기 플로우 스크린샷 1~2장 추가 (시뮬레이터 직접 탭으로)
- 심사레이더 v0.2: Gmail 유지하면서 자기쓰기 사용자 관점 아쉬운 점 다듬기 (알림 타이밍·카드 UI·상태 diff 하이라이트·필터 등 한 바퀴)
학습·상담
- LaunchAgent 동작 원리 재정리:
StartCalendarInterval은 catch-up 없음, 꺼져있던 시간은 완전 스킵 - 시뮬레이터 cfprefsd 캐시는 단순 plist 덮어쓰기로는 뚫리지 않음 → shutdown+uninstall 조합이 유일
- 토스 톤 디자인을 Flutter 에서 유지하려면 인라인 TextStyle 을 최소화하고 theme 레벨 네임드 스타일로 중앙화하는 것이 코드 유지비를 크게 낮춤