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.sh 의 git 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 --quiet 가 Not 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). 흐름:
GET /v1/apps?filter[bundleId]→ app_idPOST /v1/appStoreVersions(platform=IOS, versionString, releaseType=AFTER_APPROVAL, copyright)- 기존 ko 로컬라이제이션이 없으면 직전 live version 의 ko loc 에서 description/keywords/marketingUrl/promotionalText/supportUrl 복사 후 POST. whatsNew 는 별도 PATCH 로 “AdMob 배너 광고 추가” 박음.
findbuild (versionString match + processingState=VALID)PATCH /v1/builds/{id}에usesNonExemptEncryption=False박기 ← 이거 빠지면 다음 단계 409PATCH /v1/appStoreVersions/{id}/relationships/build(build attach)- 기존 in-progress reviewSubmission 찾기 (state ∈ READY_FOR_REVIEW / COMPLETING / UNRESOLVED_ISSUES) → reuse, 없으면 create
POST /v1/reviewSubmissionItems(version → submission)PATCH /v1/reviewSubmissions/{id}attributes.submitted=True
도중 두 함정:
- timeout 30s 부족 — ASC API 가 가끔 30s 초과. 90s 로 늘림.
- usesNonExemptEncryption 누락 409 —
POST /v1/reviewSubmissionItems시 build associatedErrors 로 surface. ASC 웹 UI 는 dialog 로 묻지만 API 는 prompt 0. 별도 PATCH 박아야 함.
최종 결과:
- 더치페이 v1.0.3 reviewSubmission
df48b9f9-b9fa-4428-bb4c-0c2423233c3fSUBMITTED - 약먹자 v1.0.2 reviewSubmission
b6a60ee5-8b38-45d9-a7a1-17a12c5a9d68SUBMITTED - 둘 다 AFTER_APPROVAL → 승인 직후 자동 출시 → W6 territory verify guard 가 174 국가 누락 점검 (mail-watcher v5 가 결과 알림)
인프라·스킬·자동화
- 이슈 신규 1건:
2026-05-12-dutchpay-gad-application-identifier-missing.md— AdMob 신규 앱 발급 시 Info.plistGADApplicationIdentifier누락 → launch crash 함정. - lessons 신규 2건:
submit-app/lessons/ios-flutter-install-needs-build-first.md—flutter 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 일괄 박기.
관련 커밋
| repo | SHA | 메시지 |
|---|---|---|
| dutch_pay_calculator | 3c5daa7 | feat(ads): AdMob iOS 운영 ID 적용 (App ID + Banner Unit) |
| dutch_pay_calculator | 39717cc | chore(version): 1.0.3+6 (AdMob 배너 광고 운영 ID 적용) |
| yakmukja | 275b285 | chore(version): 1.0.2+3 (AdMob 배너 광고 추가) |
| agent-fleet-state | e37399e | WIP: D07-prereq test push isolation (local-only, push X — D07 implementer dispatch 시 정식 commit 메시지로 amend 예정) |