Giting.
낮의 Giting

홈 · Claude Code · AI 에이전트 스킬 · iOS 출하 · App Store Connect · 코드 서명

ios-app-store-submit 대표 이미지 ea52937 (2026-08-24) · shallow clone 기준
분석 리포트실측 정보적용점원문 README

정체·구조

Claude Code 에이전트 스킬이다. 루트 SKILL.md가 사람이 읽는 플레이북이고, ios_app_store_submit/ 아래 Python 패키지 6종(readiness·privacy·design·review·recovery·resubmit)이 그 판단을 결정적 코드로 뒷받침한다. probe 기준 전체 597 파일·2.0만 줄이지만, 본체는 Python 108 파일·11,665 줄이다. pbxproj 73·plist 73·dart 73·entitlements 70·strings 69 는 전부 fixtures/ 아래 테스트용 앱 골격이라 제품 코드가 아니다. 테스트 매칭 파일 46개, CI 워크플로우 0개, MIT. 커밋 12회·저자 2명·릴리스 태그 2개로, 2026-08-05 에 시작해 08-24 까지 3주 안에 만들어진 아주 어린 리포다. SKILL.md 스스로 "실제 제출 1회(2026-08-05)로 end-to-end 검증"이라 적는다. 설치는 ~/.agents/skills/ clone + ~/.claude/skills/ 심볼릭 링크.

핵심 기능·아키텍처(단계로 분해)

v1 은 "빌드→서명→업로드→제출" 파이프라인, v2 가 그 위에 지능 계층을 감쌌다.

1. Step 0 프로젝트 발견. 번들 ID·팀 ID·버전을 pbxproj·pubspec 에서 읽는다. 하드코딩 금지(project-agnostic) 명시. 2. 레디니스 코어(readiness/). gates 3종(technical·metadata·reviewability) + planner→safe_fixes→verifier 안전 자동수정(계획→적용→검증→롤백). 3. 코드 서명. 헤드리스 Mac 의 핵심 난관. login.keychain GUI 잠금이 -25308 User interaction is not allowed 로 죽으므로 전용 build.keychain 을 만들어 인증서를 거기로만 import. OpenSSL 3.x -legacy, 서명 플래그를 앱 타깃에만 스코프 같은 실전 함정이 문서화됨. 4. 프라이버시 인텔리전스(privacy/). manifest·SDK·권한을 대조해 Info.plist 사용설명과 코드의 모순을 잡음. 5. HIG/디자인 리뷰(design/). 접근성·레이아웃·현지화·인터랙션 룰 평가. 6. 애플 사전심사(review/). apple_rules/ 의 가이드라인 JSON·required-reason API 목록 근거로 제출 전 위반 후보 산출. 7. 아카이브→익스포트→검증→업로드. asc validate 로 blocking 0 까지 반복 후 asc review submit --confirm. 8. 반려복구(recovery/)·닫힌 루프 재제출(resubmit/). 반려 사유 parser→root_cause→planner→reply. 재제출은 approval.json 의 digest 가 현재 계획 digest 와 정확히 일치해야만 승인으로 본다(사람 승인 게이트).

빌드/제출의 실제 손발은 asc CLI(App Store Connect CLI). fastlane 도, ASC REST API 직접 호출도 아니다.

실제로 되는 것·안 되는 것

되는 것: 결정적 검사기 계층이 46개 테스트로 받쳐지고, 결과를 PASS/RISK/UNKNOWN/BLOCKED 로 분리해 "모르는 것을 통과로 위장하지 않는" 규율을 코드로 강제. resubmit 승인 게이트가 digest 불일치를 STALE 로 떨어뜨려 계획이 바뀌면 승인이 자동 무효. 헤드리스 서명 함정은 실측이라 구체적.

안 되는 것/한계: Flutter 전용(Step 0 이 pubspec.yaml·flutter build ios 가정). 커밋 12회·저자 2명·실측 1회·CI 0개라 견고성 검증 전. Apple Silicon 시뮬레이터 ML 플러그인 문제는 "실기기 스크린샷 사람이 찍어라"로 넘김. 심사 규칙 JSON 은 특정 시점 스냅샷이라 애플 정책 변경을 자동 추적 못 함.

우리 적용점

우리는 또봄·닿기를 이미 App Store 에 출시했고 출하 공장은 Expo/EAS다.

  • 빌드·서명 절반은 어긋난다. EAS 는 클라우드에서 서명·아카이브, 제출은 eas submit. 이 스킬의 build.keychain 우회·security import·Xcode archive·asc CLI 는 로컬 Mac 헤드리스 빌드 전제라 그대로 못 씀(우리는 Mac mini 로컬 네이티브 빌드 금지, EAS 클라우드로 뺌).
  • 심사 전 자체 게이트 절반은 값이 크다(P0). 우리 반복 리스크는 ASC 의 Privacy Policy URL 이 접속 안 되면 그것만으로 반려되는 것. 이 스킬의 reviewability 게이트처럼 privacy.html·datgi/privacy.html 이 https·로그인 없이 200 으로 열리는지를 사람 아닌 결정적 체크로 검증하고, 실패면 BLOCKED 로 제출을 막는 걸 우리 predeploy-guard 계열에 붙일 수 있다.
  • ASC API 키 흐름은 우리도 이미 씀. EAS submit 도 ascApiKey(.p8)·ascAppId(eas.json)를 쓴다. 이 스킬의 최소권한·1회성 .p8 다운로드·chmod 600·"raw 키 채팅에 붙이지 말고 파일로" 규율은 우리 EAS 자격증명 취급 기준선으로 좋다.
  • 반려복구 루프는 EAS 무관하게 이식 가능. 반려 메일→근본원인→수정계획→사람 승인 게이트는 iOS 출시가 늘수록 값이 오른다.

가져오지 말 것

  • 헤드리스 keychain 우회 전체. 로컬 Mac 서명 전용 해법. EAS 클라우드 서명을 쓰는 우리가 재현하면 관리할 비밀(인증서·프로파일·keychain 암호)만 늘고 EAS 가 하는 일을 손으로 되돌리는 셈.
  • 자격증명 배치의 미세 리스크(반드시 점검). 키 취급 자체는 안전한 편(.p8 로컬 ~/.asc/keys/ 만·chmod 600·App Manager 최소권한·생성 명령에 시크릿 미포함). 다만 두 지점은 베끼지 말 것. (1) keychain 암호를 프로젝트 안 평문 .asc/signing/.keychain_pass 에 저장하고 승인·리포트도 프로젝트 내 .asc/ 에 쌓는다 → .gitignore 가 .asc/ 를 확실히 제외하는지 커밋 전 전수 확인(새면 서명 암호·심사 근거가 리포에 올라감). (2) 읽기전용 레디니스에도 App Manager 롤 요구는 과함 → 우리는 제출 최소 스코프만.
  • 어린 리포의 코드 의존. 커밋 12회·CI 0개·실측 1회. 발상·규칙 JSON·어휘만 참고, Python 패키지를 라이브러리로 끌어오지 않는다.

실측 정보

HEAD 커밋
ea52937 (2026-08-24) · shallow clone 기준
무엇
Claude Code 에이전트 스킬. Flutter/iOS 앱을 헤드리스 Mac에서 빌드·서명·제출까지 끌고 간다. v2에서 '애플에 넘기기 전 자체 심사'(레디니스·프라이버시·HIG·required-reason API)를 얹었다
규모 / 실측
20,048줄 · 본체 Python 108파일 11,665줄 · pbxproj/plist/dart 등은 fixtures 테스트 골격(제품 코드 아님) · 테스트 46 · CI 0 · MIT
활발 / 유지
2026-08-05 시작 ~ 08-24, 3주 안에 제작 · 커밋 12 · 저자 2 · 릴리스 2태그 · SKILL.md 스스로 '실제 제출 1회로 end-to-end 검증'이라 명시
자체 심사
apple_rules(가이드라인·프라이버시 데이터 타입·HIG·required-reason API) JSON 근거로 판정 → 결과 어휘 PASS / RISK / UNKNOWN / BLOCKED · 자격증명은 로컬·최소권한·chmod 600
라이선스
MIT

적용점

  • 이럴 때 유용Flutter/iOS 앱을 헤드리스 Mac에서 제출까지 자동화하고, 애플에 넘기기 전 자체 심사 게이트를 두려는 사람. 제출 전 apple_rules 근거로 레디니스·프라이버시·HIG를 PASS/RISK로 훑는 발상이 값이다.
  • 이럴 땐 부적합Expo/EAS(클라우드 서명·eas submit) 스택이면 이 스킬의 절반(Flutter·Xcode archive·헤드리스 keychain 우회·asc CLI)은 그대로 못 쓴다. 커밋 12·저자 2·실측 1회의 아주 어린 리포라 코드 자체를 의존하긴 이르다.
  • 먼저 볼 것값은 파이프라인 코드가 아니라 '제출 전 자체 심사'의 어휘와 규율이다. apple_rules JSON 근거, PASS/RISK/UNKNOWN/BLOCKED 결과 코드, 자격증명을 로컬·chmod 600으로만 다루는 규율. 우리 심사 게이트에 이식할 조각은 여기다.
◈ 참고용

우리 출하 스택은 Expo/EAS(클라우드 서명·eas submit)라 이 스킬의 절반(Flutter·Xcode archive·헤드리스 keychain 우회·asc CLI)은 그대로 쓸 수 없다. 하지만 나머지 절반, '제출 전에 apple_rules(가이드라인·프라이버시 데이터 타입·HIG·required-reason API) JSON을 근거로 앱을 자체 심사'하는 발상과 결과 어휘(PASS/RISK/UNKNOWN/BLOCKED), 자격증명을 로컬·최소권한·chmod 600으로만 다루는 규율은 우리 심사 게이트에 이식할 값이 있다. 커밋 12회·저자 2명·실측 1회의 아주 어린 리포라 코드 자체를 의존하진 않는다.

원문 README

아래는 ZestfulPulse/ios-app-store-submit 저장소의 README 원문입니다(GitHub 렌더, 수집 시점 기준). 저작권은 원 프로젝트에 있으며 원 저장소의 라이선스를 따릅니다. GitHub에서 보기

README 전문 펼치기

ios-app-store-submit

🇺🇸 English | 🇰🇷 한국어

Release License Stars Last Commit

From automating App Store submission to deciding whether an iOS app is actually ready to submit, and helping recover when review fails.

ios-app-store-submit preserves the existing Archive → Upload → Submit workflow while adding evidence-driven Readiness, Apple Review Guidelines, Privacy, and HIG/Design checks before submission.

This is the evolution of ios-app-store-submit, not a new repository. The public release target is v2.0.0.

v2 Architecture

ios-app-store-submit v2 architecture

v2 preserves the original build, signing, upload, and submission workflow while adding evidence-driven intelligence before and after App Review.

Current Status

Area Status Description
Readiness Core ✅ Technical / Metadata / Reviewability
Safe Auto-Fix ✅ Plan → Apply → Verify → Rollback
Apple Pre-Review ✅ App Review Guidelines preflight
Privacy Intelligence ✅ Permissions, Privacy Manifest, SDK and network evidence
HIG / Design Review ✅ Accessibility, Layout, Localization, Interaction
Rejection Recovery ✅ Rejection → cause → fix plan → verification → reply draft
Closed-loop Resubmission ✅ User-approved, evidence-bound resubmission orchestration

The v2.0.0 release combines all seven phases behind read-only inspection and explicit external-mutation gates.

What Makes It Different?

Traditional submission automation:

Archive → Validate → Upload → Submit

The enhanced workflow:

App Project
    ↓
Readiness
    ↓
Apple Pre-Review
    ↓
Privacy Intelligence
    ↓
HIG / Design Review
    ↓
Safe Fix → Verify
    ↓
Archive → Upload → Submit
    ↓
Apple Review
    ↓
Rejection Recovery
    ↓
Verify → User Approval → Resubmit → Verify

The core idea is simple: review the app before sending it to Apple.

Design Principles

Evidence before confidence

Missing evidence is not treated as success.

UNKNOWN ≠ PASS

Safe fixes only

Risky or semantic changes such as bundle identifiers, signing, certificates/provisioning, privacy semantics, user-authored content, UI semantics, navigation, and legal copy are not silently changed.

Verify before claim

Rejection recovery must not tell a reviewer that an issue is Fixed or Resolved without supporting verification evidence.

No external mutation by inspection

Inspection modes do not perform network calls, mutate App Store Connect, change signing state, or submit the app by default.

Install

Clone the existing repository into the Claude Code skill directory:

mkdir -p ~/.agents/skills
git clone https://github.com/ZestfulPulse/ios-app-store-submit.git ~/.agents/skills/ios-app-store-submit
ln -s ../../.agents/skills/ios-app-store-submit ~/.claude/skills/ios-app-store-submit

This is the Claude Code skill for the complete workflow. Claude Code discovers skills under ~/.claude/skills/, so the same skill can be used from any iOS or Flutter project.

Prerequisites

  • Apple Developer Program membership with appropriate App Store Connect access
  • Xcode and Flutter installed locally
  • The asc CLI
  • An App Store Connect API key stored locally under ~/.asc/keys/ with restrictive permissions; never place credentials in reports or commands

Headless signing uses a dedicated build keychain and the bundled scripts/setup_build_keychain.sh. Archive/export/upload still follow the existing skill guidance; signing and provisioning changes are never inferred by readiness inspection.

Use

Ask Claude Code naturally, for example:

“Build and submit this app to App Store Connect.” “Run the readiness and Apple pre-review checks.” “Analyze this rejection and prepare a verified resubmission plan.”

Quick Start

Basic inspection:

python3 scripts/readiness_check.py /path/to/your/app

Recommended full pre-submission inspection:

python3 scripts/readiness_check.py \
  /path/to/your/app \
  --pre-review \
  --privacy \
  --design

Machine-readable JSON:

python3 scripts/readiness_check.py \
  /path/to/your/app \
  --pre-review \
  --privacy \
  --design \
  --json

Understanding Results

Status Meaning
PASS No issue found within the implemented inspection scope
RISK A risk signal deserves review
UNKNOWN Required evidence is missing
BLOCKED A deterministic pre-submission problem was found

A PASS is not a guarantee of App Store approval.

Core Features

Readiness Core

Inspects technical readiness, metadata, and reviewability with evidence and provenance.

Safe Auto-Fix

Finding → Fix Plan → Diff → Apply → Verify
                                  ↓
                           Rollback on failure

Includes stale-plan detection and before/after hash evidence.

Apple Pre-Review

Uses a normalized offline registry derived from Apple Review Guidelines. Current categories include Performance, Metadata, Privacy, and Review Access. Heuristics alone cannot block submission.

Privacy Intelligence

Inspects local evidence including:

  • Info.plist permissions
  • PrivacyInfo.xcprivacy
  • Required Reason API evidence
  • SDK / package dependencies
  • Network/backend signals
  • Privacy Policy evidence

Access is deliberately separated from collection.

Location permission present
→ ACCESS = YES
→ COLLECTION = UNKNOWN
→ TRACKING = UNKNOWN

HIG / Design Review

Covers Accessibility, Layout, Localization, and Interaction. Questions requiring rendered UI evidence remain UNKNOWN instead of being falsely passed.

Rejection Recovery

Target flow:

Apple Rejection
  ↓
Parse
  ↓
Guideline / Privacy / HIG Mapping
  ↓
Root Cause
  ↓
Fix Plan
  ↓
Verification
  ↓
Reply Draft

Intended usage:

python3 scripts/readiness_check.py \
  /path/to/your/app \
  --rejection /path/to/rejection.txt

Unverified changes are not allowed to become verified reviewer-facing claims.

Closed-loop Resubmission

Phase 7 completes the recovery loop:

Inspect → Pre-Review → Privacy → Design → Fix → Verify → Submit
  → Review → Recover → Verify → User Approval → Resubmit

Build a read-only plan from a local Phase 6 recovery report:

python3 scripts/readiness_check.py \
  /path/to/your/app \
  --resubmit-plan /path/to/recovery-report.json

The plan prints exact discovered App Store Connect IDs, command previews, blockers, approval status, and a binding digest. It performs zero external mutation. Record approval separately, then execute only the exact approved digest:

python3 scripts/readiness_check.py \
  /path/to/your/app \
  --resubmit-plan /path/to/recovery-report.json \
  --approve-resubmit \
  --approval-digest PLAN_DIGEST

python3 scripts/readiness_check.py \
  /path/to/your/app \
  --resubmit-plan /path/to/recovery-report.json \
  --execute-resubmit \
  --approval-digest PLAN_DIGEST

There is no auto-resubmit. A changed build, version, reply, fix evidence, or plan digest makes the approval stale. Execution requires all gates, ready_to_send, and read-only post-submit state verification such as WAITING_FOR_REVIEW or IN_REVIEW.

Actual Submission

The existing submission workflow remains intact:

asc xcode archive
asc publish appstore
asc review submit

The intelligence layer adds safeguards around the submission engine rather than replacing it.

Safety Boundaries

Inspection does not automatically perform:

  • App Store Connect mutations
  • Apple review submission
  • GitHub mutations
  • Certificate / provisioning / signing changes
  • App Privacy answer publication
  • Risky UI or privacy semantic changes
  • Automatic resubmission; explicit user approval is always required

Roadmap

Phase 1  Readiness Core             ✅
Phase 2  Safe Auto-Fix              ✅
Phase 3  Apple Pre-Review           ✅
Phase 4  Privacy Intelligence       ✅
Phase 5  HIG / Design Review        ✅
Phase 6  Rejection Recovery         ✅
Phase 7  Closed-loop Resubmission   ✅

Target closed loop:

Inspect → Fix → Verify → Submit
                       ↓
                  Apple Review
                    ↙       ↘
               Approved   Rejected
                             ↓
                          Recover
                             ↓
                           Verify
                             ↓
                        User Approval
                             ↓
                          Resubmit

Project Philosophy

The biggest risk in App Store automation is not insufficient automation. It is automation pretending to know what it cannot prove.

  • Decide when evidence supports a decision.
  • Keep insufficiently supported facts UNKNOWN.
  • Automate only bounded safe changes.
  • Never claim resolution before verification.
  • Maintain explicit approval boundaries around external mutations.

Bundled Scripts

  • scripts/readiness_check.py — read-only readiness, pre-review, privacy, design, recovery, and resubmission planning gates.
  • scripts/gen_app_icons.py — regenerates launcher icon sizes from one source PNG.
  • scripts/setup_build_keychain.sh — creates/unlocks the dedicated headless signing keychain.

License

See the repository license file.

의견

판정에 대한 반론, 도입 경험, 정정 제보를 환영합니다. GitHub 계정으로 참여합니다.

이것도 재봤습니다

전체 리포트 →