← 작업일지

2026-05-12 · v1.0.1

2026.05.12 작업일지 v1.0.1

오후: fleet test push 격리 ephemeral clone (b) 채택 → 2/3 PASS 검증 + claim-race 만 mac-mini diverge 로 blocked → 갑작스러운 광고 앱 빌드 요청 → 더치페이 Info.plist GADApplicationIdentifier 누락 발견 → AdMob 콘솔 신규 발급 → 더치페이 1.0.3 + 약먹자 1.0.2 ASC 자동 심사 제출.

오늘의 궤적

오후 19:25 KST 부근 “어제 자동화시스템 어디까지 했니” 발화. fleet-director D07 cron 통합 직전 단 1개 blocker 가 남은 상태였음 — tests/*.test.shgit push origin main 이 local main HEAD 의 unreviewed implementer commit 까지 origin 으로 끌고 올라가는 회귀. 강대종 후속 발화 “fleet 마저 끝내야지 araseo 하려면 끝내야지” → 해법 3안 (a) 별도 branch / (b) ephemeral clone / (c) stash 중 (b) 채택.

3 test 파일에 ephemeral clone 패턴 적용. mktemp -d + git clone <origin> + trap 'rm -rf $EPHEMERAL_DIR' EXIT 6줄 prologue + cd "$EPHEMERAL_DIR/repo" body. claim-race.test.sh 만 ~/agent-fleet-state 하드코딩 3군데 (mac-mini ssh 제외) 도 ephemeral 경로로 교체. 검증: local main 에 e37399e WIP: D07-prereq test push isolation (NOT YET REVIEWED) fake commit 박은 상태에서 2 test 돌리고 origin/main grep e37399e = 0 확인. push 격리 PASS.

claim-race.test.sh 는 mac-mini SSH 의 git pull --ff-only --quietNot possible to fast-forward, aborting (exit 128) 으로 막힘 — mac-mini local main 이 origin 과 10 ahead orphan / 30 behind diverged. 이건 push 격리 문제가 아니라 별도 항목 (todos 진행중 “🛠️ mac-mini local main 정리”). memory fleet_director_d01_trigger.md start gate 룰: 둘 중 하나 충족 후 D07 가능. mac-mini reset 명시 ack 요청 송신 → 강대종 응답 전 다른 작업 부탁받음. D07 작업 중단 상태로 광고 앱 빌드로 전환.

20:25 KST “광고 붙인거 어플 뭐뭐지? 내 아이폰에 빌드해줘”. pubspec.yaml grep google_mobile_ads → 더치페이 + 약먹자 2개. iPhone17 (mac-mini USB, device id 00008150-0018459C2161401C) 에 둘 다 debug build install 시도. 첫 사이클 flutter install --debug 단독 호출 → “Could not find application bundle at build/ios/iphoneos/Runner.app” — install 은 빌드 안 함, 기존 .app 만 install. flutter clean 으로 wipe 됐고 build 단계 빠뜨림. v2 build 단계 추가했더니 ssh 비대화 shell PATH 누락 → flutter 내부 pod 못 찾고 “CocoaPods not installed” silent skip. v3 에서 export PATH=/opt/homebrew/bin:$PATH 추가하니 Xcode build 56.8s + 33.3s 둘 다 PASS.

debug install 성공했지만 강대종 폰에서 “앱이 켜지질 않는데”. debug 빌드는 Dart VM JIT 라서 daemon 없이 단독 실행 시 크래시. v4 flutter build ios --release 로 재빌드 → 약먹자 정상 launch + 광고 load 확인. 더치페이만 안 켜짐. Info.plist 전수 확인 결과 GADApplicationIdentifier key 자체가 없음. MobileAds.instance.initialize()GADInvalidInitializationException throw 하며 앱 즉시 종료. ads_service.dart docstring 에 본인이 “AppId 도 Info.plist 의 GADApplicationIdentifier 교체 필요” 적어둔 단계가 누락된 채로 어제 commit 들어왔음.

옵션 3 (본격 AdMob 콘솔 발급) 선택. 강대종 AdMob 콘솔 클릭 → 더치페이 계산기 iOS 앱 + dutch_banner_ios 배너 광고단위 발급:

  • App ID: ca-app-pub-7025432711849670~7679626181
  • Banner Unit ID: ca-app-pub-7025432711849670/6556140410

ios/Runner/Info.plist 에 GADApplicationIdentifier 신규 추가 (약먹자 reference 그대로) + lib/services/ads_service.dart _realIosBannerUnitId placeholder 교체. dutch_pay_calculator commit 3c5daa7 feat(ads): AdMob iOS 운영 ID 적용 (App ID + Banner Unit) main 직접 push. release 재빌드. flutter install hang 떨어져서 xcrun devicectl device install app --device <id> ~/apps/dutch_pay_calculator/build/ios/iphoneos/Runner.app 직접 호출 우회 → 설치 성공. 강대종 폰 광고 정상 load 확인 ack.

App Store 심사 제출 사이클 (둘 다)

강대종 “광고버전 출시는 언제해 앱스토어 출시해야지” 발화 → /submit-app 스킬 진입. ASC live 상태 API 점검:

  • 더치페이: live v1.0.2 (READY_FOR_SALE 2026-04-11). 광고 코드 미포함.
  • 약먹자: live v1.0.1 (READY_FOR_SALE 2026-04-12). 광고 코드 미포함 (commit 이후 새 빌드 ASC 0건).

둘 다 출시 사이클 GO. 더치페이 1.0.2+5 → 1.0.3+6 / 약먹자 1.0.1+2 → 1.0.2+3 bump + commit/push.

mac-mini SSH 라우팅으로 flutter build ipa --release:

  • 더치페이 IPA 22.9MB → dutchpay-1.0.3-6.ipa (Korean filename → ASCII rename)
  • 약먹자 IPA 24.6MB → yakmukja-1.0.2-3.ipa

xcrun altool --upload-app --type ios -f <ipa> --apiKey RU7URQ5453 --apiIssuer 03e6123e-... 둘 다 UPLOAD SUCCEEDED (Delivery UUIDs 52fc4569-... + f66e6879-...). ASC build processing 약먹자는 첫 polling (60s) 만에 VALID, 더치페이는 직후 VALID.

ASC API 자동 submit 스크립트 (asc-submit.py)

Python 3.9 호환 작성 (mac-mini 의 system python 이 3.9). 흐름:

  1. GET /v1/apps?filter[bundleId] → app_id
  2. POST /v1/appStoreVersions (platform=IOS, versionString, releaseType=AFTER_APPROVAL, copyright)
  3. 기존 ko 로컬라이제이션이 없으면 직전 live version 의 ko loc 에서 description/keywords/marketingUrl/promotionalText/supportUrl 복사 후 POST. whatsNew 는 별도 PATCH 로 “AdMob 배너 광고 추가” 박음.
  4. find build (versionString match + processingState=VALID)
  5. PATCH /v1/builds/{id}usesNonExemptEncryption=False 박기 ← 이거 빠지면 다음 단계 409
  6. PATCH /v1/appStoreVersions/{id}/relationships/build (build attach)
  7. 기존 in-progress reviewSubmission 찾기 (state ∈ READY_FOR_REVIEW / COMPLETING / UNRESOLVED_ISSUES) → reuse, 없으면 create
  8. POST /v1/reviewSubmissionItems (version → submission)
  9. PATCH /v1/reviewSubmissions/{id} attributes.submitted=True

도중 두 함정:

  • timeout 30s 부족 — ASC API 가 가끔 30s 초과. 90s 로 늘림.
  • usesNonExemptEncryption 누락 409POST /v1/reviewSubmissionItems 시 build associatedErrors 로 surface. ASC 웹 UI 는 dialog 로 묻지만 API 는 prompt 0. 별도 PATCH 박아야 함.

최종 결과:

  • 더치페이 v1.0.3 reviewSubmission df48b9f9-b9fa-4428-bb4c-0c2423233c3f SUBMITTED
  • 약먹자 v1.0.2 reviewSubmission b6a60ee5-8b38-45d9-a7a1-17a12c5a9d68 SUBMITTED
  • 둘 다 AFTER_APPROVAL → 승인 직후 자동 출시 → W6 territory verify guard 가 174 국가 누락 점검 (mail-watcher v5 가 결과 알림)

인프라·스킬·자동화

  • 이슈 신규 1건: 2026-05-12-dutchpay-gad-application-identifier-missing.md — AdMob 신규 앱 발급 시 Info.plist GADApplicationIdentifier 누락 → launch crash 함정.
  • lessons 신규 2건:
    • submit-app/lessons/ios-flutter-install-needs-build-first.mdflutter install 단독은 빌드 안 함. flutter build ios --debug 선행 필수. flutter install hang 시 xcrun devicectl device install app 직접 호출 fallback.
    • submit-app/lessons/ios-asc-uses-non-exempt-encryption.md — ASC API submit 시 PATCH /v1/builds/<id> {usesNonExemptEncryption: false} 필수. 안 박으면 reviewSubmissionItems 409. 영구 해결책: Info.plist 에 ITSAppUsesNonExemptEncryption=false 박기.
  • 재사용 가능 스크립트: /tmp/asc-submit.py — Python 3.9 호환 ASC API 자동 submit 스크립트. 다음 앱들도 reuse 가능.

학습·상담

  • flutter install != flutter run — install 은 build 가 아니다. 헷갈리지 말 것. CI/script 화 할 때 build 단계 명시 필수.
  • ssh 비대화 shell PATH — flutter 같은 wrapper 가 내부적으로 pod, xcodebuild, git 호출하는데 PATH 누락 시 silent skip 으로 죽음. mac-mini 빌드 스크립트는 항상 export PATH=/opt/homebrew/bin:$PATH 첫 줄.
  • AdMob SDK 신규 앱 5단계 체크리스트 (ads_service.dart docstring 에 이미 있는데 절차로 강제 안 된 상태): 콘솔 앱 등록 → 광고단위 발급 → Info.plist GADApplicationIdentifier → ads_service _realIosBannerUnitId → release 실기 검증.
  • ASC API automation — usesNonExemptEncryption 같은 사소한 필드 누락도 409 로 폭격. Web UI 에선 자동 dialog 라 눈치 못 챔. API-first 자동화 할 때 Apple 의 “ASC 가 자동 prompt 해주는 것들” 도 코드로 박아야 함.

남은 작업

  • fleet D07 implementer dispatch — mac-mini reset ack 받으면 즉시 claim-race 3/3 PASS 검증 → D07 cron/launchd 통합 시작 가능. start gate 룰 충족 1/2 (push 격리 완료, mac-mini reset 보류).
  • ASC 심사 결과 폴링 — mail-watcher v5 가 4시간 주기로 Gmail 폴링. dutchpay/yakmukja 둘 다 24~48h 내 결과 텔레그램 알림 예상.
  • ITSAppUsesNonExemptEncryption Info.plist 영구 해결 — 다음 사이클부터 API PATCH 불필요하게 두 앱 + 다른 앱들 Info.plist 일괄 박기.

관련 커밋

repoSHA메시지
dutch_pay_calculator3c5daa7feat(ads): AdMob iOS 운영 ID 적용 (App ID + Banner Unit)
dutch_pay_calculator39717ccchore(version): 1.0.3+6 (AdMob 배너 광고 운영 ID 적용)
yakmukja275b285chore(version): 1.0.2+3 (AdMob 배너 광고 추가)
agent-fleet-statee37399eWIP: D07-prereq test push isolation (local-only, push X — D07 implementer dispatch 시 정식 commit 메시지로 amend 예정)