← 작업일지

2026-04-23 · v1.0.0

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(반자동) 안 으로 확정.

핵심 오해 포인트: launchdStartCalendarInterval 은 컴퓨터가 꺼져있던 시간은 catch-up 하지 않는다. 맥이 06:45 에 꺼져있었으면 그날 자동 sync 는 그냥 스킵. 이건 정상이다.

병원 todo 드롭과 “일상생활 금지” 경계

07:53 강대종님이 ”🏥 공덕M 재활의학과 왼쪽 팔꿈치 진료” todo 를 “todo 에서 빼주세요 드롭 (일상생활 기록x)” 이라고 요청. 기본 /todo 규칙은 “하드삭제 금지, 취소 섹션 이동” 이지만, todos 는 공개 페이지 /cancelled.html 로 파싱되어 퍼블릭 노출되는데 개인 건강 정보를 공개 페이지에 남기는 건 부적절 하다고 판단 → 하드삭제 처리.

후속 조치:

  1. ~/todo/todos.md 에서 해당 라인 완전 제거 (b5f70d5)
  2. macOS Reminders “Claude” 목록에서도 해당 항목 삭제
  3. ~/daejong-page/todos/2026-04-23.md 스냅샷 새로 생성 + index.json 업데이트 (69425f8)
  4. 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.dart16개 네임드 스타일 추가: screenTitle, sectionLabel, pillText, moonCaption, moonCaptionWide, prompt, body, soft, faint, aiReply, aiReplySoft, milestoneValue, milestoneLabel, heatLegend, buttonLabel, buttonLabelLg
  • AppSize 토큰(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 답글 등장 애니메이션

  • _AiReplyCard StatelessWidget → 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장 캡처:

  1. 01-home-loaded.png — 7일 연속 + 엔트리 3개 + AI 답글 (홈 히어로)
  2. 02-stats-heatmap.png — “한 해의 결” 히트맵 + 12 DAYS · 7 STREAK · 7 LONGEST + 플라이아웃
  3. 03-home-prompt.png — 빈 상태 프롬프트 카드 + “한 줄 쓰기” CTA + “아직 기록이 없어요”

촬영 과정에서 예상 못한 함정 2개:

  • 시뮬레이터 UI 자동 클릭 불가: cliclick, osascript System Events 둘 다 macOS Accessibility 권한 때문에 탭이 안 먹음 → 대신 root_shell.dartHANJUL_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.dart HANJUL_START_TAB dev flag — 기본값 0 이라 무해, 스크린샷 재촬영 시 유용

관련 커밋

repoSHA메시지
hanjuldbdc301refactor: GradientTextStyles + AppSize tokens, PressScale, haptics
hanjul1958b9bfeat: SnackBar undo action on entry delete
hanjulab0bca8feat: animate AI reply card entrance (fade + slide-up 12%)
hanjulbba6a6adocs: store metadata ko/en drafts
hanjul52ddafafeat: iOS store screenshots (3) + HANJUL_START_TAB dev flag
daejong-page3fd17bcfeat: privacy policy for 한줄일기 (AI proxy disclosure)
daejong-page69425f8todos: 2026-04-23 — 삭제: 공덕M 팔꿈치 진료 (일상생활 기록 제외)
todob5f70d5todo: 삭제 - 공덕M 팔꿈치 진료 (일상생활 기록 대상 제외)
automationsf186152report: 2026-04-23-mac.json
automations7ac8499report: 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 레벨 네임드 스타일로 중앙화하는 것이 코드 유지비를 크게 낮춤