Files
asciinevrdie/doc/audit-report-2026-02-13.md
JiWoong Sul dadd25837d docs: CLAUDE.md 및 감사 보고서 업데이트
- CLAUDE.md 아키텍처 문서 최신화
- 감사 보고서 수정 사항 반영
2026-02-23 15:49:46 +09:00

27 KiB

ASCII Never Die - 프로젝트 종합 감사 리포트

감사일: 2026-02-13 검사 수행: 7개 전문 에이전트 병렬 검사 대상: 코드 품질, 빌드/테스트, 출시 준비, 사업/수익화, 보안, 로컬라이제이션/접근성, 원본 충실도


0. 전체 요약 대시보드

영역 점수 CRITICAL HIGH MEDIUM LOW
보안 8/10 - - 1 -
출시 준비 9/10 4 → 0 4 → 0 5 -
사업/수익화 6/10 5 → 3 1 1 1
코드 품질 8/10 - 3 → 1 3 → 1 1 → 0
빌드/테스트 9/10 - 1 → 0 2 -
로컬라이제이션 8/10 4 → 0 3 → 1 4 -
원본 충실도 해결됨 1 → 0 - - -

종합 판정: CRITICAL 이슈 15건 → 3건 잔여 (모두 외부 콘솔 작업). 코드 작업 가능 항목 대부분 해결 완료.

2026-02-15 업데이트 #1: P1 코드 작업 10건 완료 (iOS DEVELOPMENT_TEAM, Android INTERNET 권한, iOS AdMob/ATT/SKAdNetwork, macOS 네트워크 권한, 앱 이름 통일, iOS 로컬라이제이션, dart format, 테스트 수정, macOS 저작권, 일본어 ARB 번역)

2026-02-15 업데이트 #2: P2 코드 작업 6건 완료 (ARB 하드코딩 전환 68키, 대형 파일/함수 분리 23+신규 파일, Clean Architecture 정리 shared/ 이동, ProGuard/R8 설정, _toRoman 중복 제거, CLAUDE.md 현행화)


1. 보안

1.1 해당 없음 (소유자 확인 완료)

# 이슈 소유자 판단
S1 JKS 키스토어가 Git에 추적 중 해당 없음 - 개인 비공개 저장소이므로 문제 없음
S2 key.properties 평문 비밀번호 Git 노출 해당 없음 - 개인 비공개 저장소이므로 문제 없음

참고: 저장소가 공개(public)로 전환되거나 팀 협업으로 확장될 경우 재검토 필요

1.2 WARNING

  • .vscode/, PLAN.md가 추적되지 않은 상태로 존재

1.4 양호 항목

항목 상태
개인정보 처리방침 3개국어 준비 완료 (doc/privacy-policy.md)
네트워크 요청 SDK 통한 간접 사용만 (직접 HTTP 없음)
사용자 데이터 수집 개인정보 미수집 (회원가입/로그인 없음)
분석/추적 SDK 미사용 (Firebase, Sentry 등 없음)
API 키 하드코딩 없음
로컬 저장소 게임 상태/설정만 저장, 민감 데이터 없어 암호화 불필요

2. 출시 준비 상태 - 7개 0개 CRITICAL (모두 해결)

2.1 CRITICAL (출시 차단)

# 이슈 상세
R1 iOS Bundle ID = com.example.asciineverdie 수정 완료 - com.naturebridgeai.asciineverdie로 변경됨
R2 macOS Bundle ID = com.example.asciineverdie 수정 완료 - com.naturebridgeai.asciineverdie로 변경됨
R3 iOS DEVELOPMENT_TEAM 미설정 수정 완료 - DEVELOPMENT_TEAM = 82SY27V867 (Debug/Release/Profile)
R4 정치적 문구가 iOS/Android 메타데이터에 포함 의도적 포함 - 소유자 확인 완료. 앱스토어 심사 시 거부 가능성 인지
R5 Android 릴리즈에 INTERNET 권한 누락 수정 완료 - AndroidManifest.xml(main)에 INTERNET 권한 추가
R6 iOS GADApplicationIdentifier 누락 수정 완료 - Info.plist에 GADApplicationIdentifier, SKAdNetworkItems, NSUserTrackingUsageDescription 추가
R7 앱 스크린샷 미준비 App Store/Google Play 제출 필수 요소

2.2 HIGH (출시 전 수정 권장)

# 이슈 상세
R8 앱 이름 플랫폼별 불일치 수정 완료 - 전 플랫폼 ASCII Never Die로 통일
R9 macOS Release entitlements에 네트워크 권한 없음 수정 완료 - com.apple.security.network.client 추가
R10 Android ProGuard/R8 미설정 수정 완료 - isMinifyEnabled=true, isShrinkResources=true, proguard-rules.pro 추가
R11 macOS PRODUCT_COPYRIGHT = Copyright 2025 com.example 수정 완료 - Copyright © 2025 naturebridgeai로 변경

2.3 MEDIUM

  • Android minSdk/targetSdk가 Flutter 기본값 의존 (명시적 설정 권장)
  • iOS Podfile에서 platform 버전 주석 처리됨
  • 스플래시 화면이 기본 흰색 배경 (브랜딩 스플래시 권장)
  • Flavor/환경 분리 없음 (AdMob 테스트/프로덕션 분리 불가)
  • flutter_launcher_icons에 macOS 설정 없음

2.4 플랫폼별 상세

iOS

항목 설정값 상태
CFBundleDisplayName ASCII Never Die 수정 완료
PRODUCT_BUNDLE_IDENTIFIER com.naturebridgeai.asciineverdie 수정 완료
DEVELOPMENT_TEAM 82SY27V867 수정 완료
GADApplicationIdentifier ca-app-pub-6691216385521068~8216990571 수정 완료
SKAdNetworkItems Google (cstr6suwn9.skadnetwork) 수정 완료
NSUserTrackingUsageDescription 설정됨 수정 완료
CFBundleLocalizations en, ko, ja 수정 완료
IPHONEOS_DEPLOYMENT_TARGET 13.0 OK
앱 아이콘 전 사이즈 존재 (20~1024px) OK
LaunchScreen 기본 Flutter 템플릿 개선 권장

Android

항목 설정값 상태
applicationId com.naturebridgeai.asciineverdie OK
android:label ASCII Never Die 수정 완료
릴리즈 서명 key.properties 참조 OK
AdMob App ID ca-app-pub-6691216385521068~8216990571 OK
앱 아이콘 mdpi~xxxhdpi + Adaptive Icon OK
INTERNET 권한 main AndroidManifest에 추가 수정 완료
ProGuard/R8 isMinifyEnabled=true, proguard-rules.pro 수정 완료

macOS

항목 설정값 상태
PRODUCT_BUNDLE_IDENTIFIER com.naturebridgeai.asciineverdie 수정 완료
PRODUCT_NAME ASCII Never Die 수정 완료
PRODUCT_COPYRIGHT Copyright © 2025 naturebridgeai 수정 완료
Sandbox 활성화 OK
네트워크 권한 (Release) network.client 추가 수정 완료
MACOSX_DEPLOYMENT_TARGET 10.15 OK
앱 아이콘 16~1024px 존재 OK

3. 사업/수익화

3.1 현재 구현 상태

참고: 사용자는 "IAP가 아직 설정이 안되어있다"고 인지하고 있으나, 실제로는 IAP와 AdMob 코드가 이미 구현되어 있고 프로덕션 ID만 미설정 상태임.

수익원 코드 구현 프로덕션 준비 준비도
리워드 광고 (부활/되돌리기) 구현됨 (ad_service.dart) Android ID 설정 완료, iOS 미설정 80%
인터스티셜 광고 (충전/속도업) 구현됨 Android ID 설정 완료, iOS 미설정 80%
광고 제거 IAP ($9.99) 구현됨 (iap_service.dart) 스토어 상품 미등록 50%

3.2 CRITICAL

# 이슈
B1 프로덕션 광고 단위 ID - Android 완료, iOS 플레이스홀더 잔여 (ad_service.dart:77,81)
B2 iOS AdMob Info.plist 설정 누락 수정 완료 - GADApplicationIdentifier, SKAdNetworkItems, NSUserTrackingUsageDescription 추가
B3 IAP 스토어 상품 미등록 (Google Play Console / App Store Connect)
B4 iOS StoreKit Configuration 파일 없음 (로컬 테스트 불가)
B5 iOS/macOS Bundle ID가 com.example 수정 완료 - com.naturebridgeai.asciineverdie로 변경됨

3.3 앱스토어 메타데이터

항목 상태 위치
앱 설명 (한/영/일) 완비 doc/app-description.txt
간단한 설명 (80자) 완비 각 언어별 준비
개인정보 처리방침 완비 (3개국어) doc/privacy-policy.md
앱 스크린샷 미준비 -
프로모션 텍스트 미확인 -
랜딩 페이지/웹사이트 미준비 -

3.4 수익 모델 리스크 분석

리스크 설명 권장
원작 무료 Progress Quest는 완전 무료 오픈소스 - 클론 유료화 반감 가능 무료+광고 모델 유지, IAP 가격 인하 권장
광고 제거 $9.99 방치형 RPG 장르 대비 2~3배 높은 가격 (통상 $2.99~$4.99) $2.99~$4.99로 인하 권장
오프라인 전용 광고 노출에 네트워크 필요 - 오프라인 시 광고 수익 없음 인지 필요
일회성 수익 광고 제거 IAP 한 번이면 이후 수익 제로 코스메틱 IAP 추가 고려
저작권 원본 알고리즘/구조 사용 - PQ 저작자와의 관계 정리 필요 법률 검토 권장

3.5 Bundle ID 일관성

플랫폼 Bundle ID 상태
Android com.naturebridgeai.asciineverdie OK
iOS com.naturebridgeai.asciineverdie 수정 완료
macOS com.naturebridgeai.asciineverdie 수정 완료

4. 빌드/테스트/정적분석

4.1 실행 결과

단계 결과 상세
flutter pub get 통과 의존성 정상 설치, 31개 패키지 업데이트 가능
dart format --set-exit-if-changed . 통과 210개 중 0개 변경 (수정 완료)
flutter analyze 통과 (info 58건) error 0, warning 0, info 58 (모두 스타일 수준)
flutter test 통과 105 통과 / 0 실패 (수정 완료)

4.2 포맷 미준수 주요 파일 - 수정 완료 (42개 파일 자동 포맷 적용됨)

4.3 정적분석 이슈 (56건 info)

유형 건수 위치
unnecessary_brace_in_string_interps 4 lib/data/game_text_l10n.dart
curly_braces_in_flow_control_structures 10 lib/data/game_text_l10n.dart
dangling_library_doc_comments 1 lib/src/core/util/pq_logic.dart:1
avoid_print ~30 test/core/engine/gcd_simulation_test.dart
prefer_interpolation_to_compose_strings 4 같은 테스트 파일

4.4 실패 테스트 - 수정 완료

  • 파일: test/core/engine/skill_service_test.dart:563
  • 원인: SkillData.debugModeatkModifier가 0.25→0.15, mpCost가 100→140으로 변경되었으나 테스트가 이전 값을 기대
  • 수정: 테스트 기대값을 현재 데이터에 맞게 업데이트 (0.15, mpCurrent 10)

5. 코드 품질

5.1 Clean Architecture 위반 - 수정 완료

core/ 레이어에 Flutter UI 의존성 존재

수정 내용: core/animation/, core/constants/ascii_colors.dart, core/l10n/game_data_l10n.dart 등 Flutter UI 의존 파일 19개를 shared/ 디렉토리로 이동. core/ 레이어는 순수 Dart만 유지.

이동 항목 이동 전 이동 후
animation (11개 파일) core/animation/ shared/animation/
ascii_colors.dart core/constants/ shared/theme/
game_data_l10n.dart core/l10n/ shared/l10n/

양호: core/engine/, core/model/, core/util/ 등 핵심 도메인 로직은 순수 Dart로 작성

5.2 SRP 위반 - 대형 파일 - 부분 수정 완료

수정 완료: 12개 대형 파일에서 23+개 신규 파일 추출. 대부분 400 LOC 이하로 감소.

파일 이전 LOC 현재 LOC 추출된 파일
game_play_screen.dart 1,536 879 desktop_*_panel.dart (3개)
canvas_battle_composer.dart 1,475 544 monster_frames.dart, combat_text_frames.dart
progress_service.dart 1,247 832 task_generator.dart, death_handler.dart, loot_handler.dart
arena_battle_screen.dart 976 759 arena_hp_bar.dart
settings_screen.dart 821 455 retro_settings_widgets.dart
arena_service.dart 811 308 arena_combat_simulator.dart
death_overlay.dart 795 death_combat_log.dart, death_buttons.dart
skill_service.dart 759 588 skill_auto_selector.dart
app.dart 723 460 app_theme.dart, splash_screen.dart
combat_tick_service.dart 681 443 player_attack_processor.dart
game_statistics.dart 616 session_statistics.dart, cumulative_statistics.dart

참고: StatefulWidget 상태 결합으로 인해 일부 파일은 400 LOC 이하 분리가 어려움. 정적 데이터 파일은 LOC 초과 허용.

5.3 SRP 위반 - 대형 함수 (HIGH)

함수 LOC 위치
_showOptionsMenu() 263 layouts/mobile_carousel_layout.dart:285
build() 237 widgets/statistics_dialog.dart:316
_handleCombatEvent() 207 widgets/ascii_animation_card.dart:281
build() 199 widgets/statistics_dialog.dart:107
build() 183 hall_of_fame/hall_of_fame_entry_card.dart:30
build() 181 hall_of_fame/game_clear_dialog.dart:40
_buildMonsterBar() 142 widgets/hp_mp_bar.dart:384
(보상 표시) 140 widgets/return_rewards_dialog.dart:217
build() 129 widgets/notification_overlay.dart:121
fromJson() 113 core/model/save_data.dart:150
(아이템 생성) 101 core/engine/item_service.dart:195

5.4 타입 안전성 (MEDIUM)

위치 문제
features/game/widgets/return_rewards_dialog.dart:452 Color _getRarityColor(dynamic rarity) - ItemRarity?로 교체 필요
core/notification/notification_service.dart:31 Map<String, dynamic>? data - 타입 안전 모델 권장
core/engine/story_service.dart:20 Map<String, dynamic>? data - 동일
core/model/save_data.dart:156-157 불필요한 cast<dynamic>() 사용

참고: 생성 파일(.g.dart, .freezed.dart)의 Map<String, dynamic>은 JSON 직렬화 패턴이므로 허용

5.5 코드 중복 - 수정 완료

_toRoman() 함수 3곳 중복

수정 내용: game_play_screen.dartstory_page.dart의 중복 _toRoman() 제거, core/util/roman.dartintToRoman() import로 통일

5.6 TODO/FIXME 미완성 마커

위치 내용 상태
core/engine/iap_service.dart:15 TODO: Google Play Console / App Store Connect에서 상품 생성 후 ID 교체 외부 작업
ad_service.dart:77,81 iOS 프로덕션 광고 ID 플레이스홀더 iOS 차후 설정
ad_service.dart:74-75,78-79 Android 프로덕션 광고 ID 플레이스홀더 수정 완료

5.7 싱글톤 패턴 과다 사용 (LOW - 미완료)

6개 서비스가 싱글톤: AdService, IAPService, DebugSettingsService, ReturnRewardsService, CharacterRollService, AudioService

테스트 가능성(testability) 저하. DI(의존성 주입) 패턴으로 전환 권장. (P2 #25)

5.8 양호 항목

항목 상태
네이밍 컨벤션 전반적으로 잘 준수 (snake_case 파일, PascalCase 클래스, camelCase 변수)
미사용 import lib/ 내 0건
flutter analyze lib/ 이슈 0건 (56건 모두 test/ 디렉토리)
에러 핸들링 ad_service, iap_service에서 적절한 try-catch + debugPrint 로깅

6. 로컬라이제이션 / 접근성

6.1 로컬라이제이션 설정 (양호)

항목 상태
l10n.yaml 존재, 올바르게 설정
ARB 파일 3개 언어 (en, ko, ja)
flutter_localizations pubspec.yaml에 포함
generate: true 설정됨
localizationsDelegates MaterialApp에 적용
게임 데이터 번역 시스템 별도 구축 (game_text_l10n, game_translations_ko/ja)

6.2 로컬라이제이션 CRITICAL

# 이슈 상세
L1 iOS NSHumanReadableCopyright 정치적 문구 의도적 포함 - 소유자 확인 완료. 심사 거부 가능성 인지
L2 일본어 ARB 70%+ 미번역 수정 완료 - 전체 148개 키 중 약 75개 키 일본어 번역 완성. STR/CON/HP/MP/BGM/OK 등 국제 표준 약어는 영어 유지
L3 Arena 관련 화면 전체 영어 하드코딩 수정 완료 - Arena 24키, Statistics 35키, Notification 9키 = 68개 ARB 키 추가 (en/ko/ja 3개 언어)
L4 statistics_dialog.dart 하드코딩 수정 완료 - ARB 키로 전환
L5 iOS CFBundleLocalizations 미설정 수정 완료 - Info.plisten, ko, ja 추가

6.3 로컬라이제이션 기타

심각도 이슈
MEDIUM notification_overlay.dart 타입 라벨 영어 하드코딩 (LEVEL UP, QUEST DONE, BOSS SLAIN 등)
LOW victory_overlay.dart 스탯 약어 하드코딩 (STR, CON 등 - 국제 통용 약어, 의도적일 수 있음)
LOW death_overlay.dart GAME OVER 하드코딩 (게이머 용어, 의도적일 수 있음)
LOW 날짜 포매팅 고정 (DateFormat('yyyy-MM-dd HH:mm')) - 로케일별 미적용

6.4 접근성 (전반적으로 미흡)

항목 상태 설명
Semantics 위젯 0회 사용 프로젝트 전체에서 단 한 번도 사용하지 않음
텍스트 크기 대응 미구현 textScaleFactor/textScaler 사용 없음
스크린 리더 미지원 tooltip 37곳 중 10곳만 제공
키보드 네비게이션 최소 수준 FocusNode 1곳만 사용

6.5 색상 대비

모드 요소 대비율 WCAG
다크 기본 텍스트 (#C0CAF5 on #1A1B26) 10.5:1 AAA 충족
다크 골드 텍스트 (#E0AF68 on #24283B) 5.8:1 AA 충족, AAA 미달
다크 Muted 텍스트 (#565F89 on #1A1B26) 3.3:1 AA 미달
라이트 기본 텍스트 (#1F1F28 on #FAF4ED) 14.5:1 AAA 충족
라이트 Muted 텍스트 (#797593 on #FAF4ED) 4.5:1 AA 충족, AAA 미달

7. 원본 충실도 (Progress Quest 6.4 대비)

7.1 핵심 발견

CLAUDE.md: "Progress Quest 6.4를 100% 동일하게 복제" 현실: 알고리즘 70% / 데이터 0% / 게임 디자인 40%

이 프로젝트는 원본의 "100% 클론"이 아니라, 원본의 핵심 메커니즘을 기반으로 **독자적인 세계관("ASCII Never Die" / 디지털 판타지)**과 확장된 전투/스킬 시스템으로 재구성한 스핀오프/리메이크입니다.

7.2 알고리즘 충실도 (70%)

구현 완료 (원본과 동일)

기능 원본 위치 현재 위치 상태
캐릭터 스탯 롤링 (3d6) NewGuy.pas:55-68 pq_random.dart:36 100% 동일
이름 생성 NewGuy.pas:218-240 pq_random.dart 100% 동일
몬스터 생성 Main.pas:523-605 pq_monster.dart:61-170 100% 동일
몬스터 수식어 (sick/young/big/special) Main.pas:402-454 pq_monster.dart 100% 동일
장비 획득 (winEquip) Main.pas:791-830 pq_item.dart:217-245 100% 동일
아이템 획득 (winItem/specialItem) Main.pas:903-908 pq_item.dart 100% 동일
퀘스트 시스템 (5종 퀘스트) Main.pas:910-990 pq_quest.dart:62-136 100% 동일
시네마틱 (3가지 시나리오) Main.pas:456-521 pq_quest.dart:194-261 구조 100% 동일
주문서(SpellBook) 시스템 Main.pas:770-774 pq_quest.dart:268-283 100% 동일
로마 숫자 변환 Main.pas:992-1053 roman.dart 100% 동일
전리품 생성 Main.pas:625-630 _winLoot() 100% 동일

변경된 로직

항목 원본 현재 차이
경험치 시간 기반 (20+1.15^level)*60 몬스터 경험치 기반 (10+level*5)*(25+level/3) 완전히 다른 공식
HP 증가 CON/3 + 1 + random(4) 18 + CON/5 + random(5) ~3배 높음
MP 증가 INT/3 + 1 + random(4) 6 + INT/5 + random(3) 다름
게임 루프 간격 200ms 50ms 4배 빠른 tick
Plot Bar 공식 60*60*(1+5*actCount) (무한) 고정값 [300, 7200, 10800, 10800, 5400, 1800] 고정 5 Act
진행 구조 무한 진행 (Act I, II, III...) 고정 5 Act + 엔딩 (Lv100 종료) 근본적 차이
전투 시간 바 자동 완료 (항상 승리) HP/ATK 기반 실시간 전투 (사망 가능) 근본적 차이

7.3 데이터 충실도 (0%)

Config.dfm의 원본 데이터를 전혀 사용하지 않음. 모든 데이터가 "디지털 판타지" 세계관으로 완전 교체.

데이터 원본 예시 현재 예시
Spells (44개) Slime Finger, Rabbit Punch Garbage Collection, Memory Optimization
Weapons (37개) Stick, Broken Bottle, Shiv Keyboard, USB Cable, Ethernet Cord
Armors (20개) Lace, Macrame, Burlap Firewall, Spam Filter, Antivirus
Shields (16개) Parasol, Pie Plate CAPTCHA, Rate Limiter
Monsters (231개) Rat, Goblin, Dragon Syntax Error, Buffer Overflow
Races (21개) Half Orc, Half Man Byte Human, Null Elf
Klasses (18개) Ur-Paladin, Voodoo Princess Bug Hunter, Debugger Paladin
Titles (9개) Mr., Mrs., Sir Dev, Senior, Lead

레벨 범위도 대폭 확장: 원본 몬스터 053 → 현재 0100, 무기 015 → 070

7.4 원본에 없는 추가 시스템 (13개)

  1. 전투 시스템 (CombatState, CombatStats, HP/MP, 턴제 전투)
  2. 사망/부활 시스템 (DeathInfo, 장비 손실)
  3. 스킬/버프 시스템 (SkillSlots, 액티브/패시브 스킬)
  4. 물약 시스템 (PotionService, HP/MP 물약)
  5. 종족/직업 특성 (ClassTraits, RaceTraits, 패시브 보너스)
  6. 아레나 시스템 (arena_service.dart, PvP 전투)
  7. 명예의 전당 (hall_of_fame_storage.dart)
  8. 보스 전투 메커니즘 (페이즈, 분노, 보호막, 특수 능력)
  9. 장비 스탯 (ItemStats, 공격력/방어력/HP 보너스)
  10. 스토리/시네마틱 시스템 (StoryService, 레벨 기반 Act 전환)
  11. 배속 시스템 (1x/2x/5x)
  12. 통계 시스템 (GameStatistics)
  13. 게임 클리어 시스템 (레벨 100, 최종 보스 처치 시 엔딩)

7.5 CLAUDE.md와의 충돌 - 해결 완료

CLAUDE.md에 명시된 규칙이 현재 구현과 괴리

수정 완료: CLAUDE.md를 현재 프로젝트 실태에 맞게 업데이트.

  • "100% 동일하게 복제" → "핵심 메커니즘 기반 독자적 리메이크"
  • 원본 충실도 제약 삭제
  • 디렉토리 구조, 화면 구성 등 현행화

8. 우선순위별 액션 플랜

P0 - 즉시 (심사 차단)

# 작업 난이도 상태
1 Git에서 JKS 키스토어 + key.properties 제거 - 해당 없음 - 개인 비공개 저장소
2 .gitignore에 민감 파일 패턴 추가 - 해당 없음 - 개인 비공개 저장소
3 정치적 문구 제거 - 해당 없음 - 의도적 포함
4 iOS/macOS Bundle ID 변경 - 수정 완료

P1 - 출시 전 필수

# 작업 난이도 상태
5 iOS DEVELOPMENT_TEAM 설정 낮음 수정 완료 - 82SY27V867
6 Android 릴리즈 INTERNET 권한 추가 낮음 수정 완료
7 iOS GADApplicationIdentifier + SKAdNetworkItems + ATT 추가 중간 수정 완료
8 macOS Release entitlements 네트워크 권한 추가 낮음 수정 완료
9 앱 이름 통일 (ASCII Never Die) - 모든 플랫폼 낮음 수정 완료
10 AdMob 프로덕션 광고 단위 ID 설정 중간 부분 완료 - Android 리워드/인터스티셜 ID 설정 완료. iOS는 차후 설정 예정
11 IAP 스토어 상품 등록 (Google Play / App Store Connect) 중간 준비 중 - 소유자 작업 진행 중
12 앱 스크린샷 제작 (각 플랫폼/언어별) 중간 준비 중 - 소유자 작업 진행 중
13 ~일본어 ARB 번역 완성 (70개 키) 중간 수정 완료
14 iOS CFBundleLocalizations 설정 낮음 수정 완료
15 dart format . 적용 낮음 수정 완료
16 실패 테스트 수정 (skill_service_test.dart:563) 낮음 수정 완료
17 macOS PRODUCT_COPYRIGHT 수정 낮음 수정 완료

P2 - 출시 후 개선

# 작업 난이도 상태
18 하드코딩 문자열 ARB 키 전환 (arena, statistics, notification 등) 높음 수정 완료 - 68키 추가 (en/ko/ja)
19 대형 파일 분리 (game_play_screen, progress_service 등 12개 파일) 높음 수정 완료 - 23+개 신규 파일 추출
20 대형 함수 리팩토링 (_showOptionsMenu 263줄 등 11개 함수) 높음 부분 완료 - 파일 분리와 함께 주요 함수 축소
21 Clean Architecture 위반 정리 (core/animation, core/constants -> shared/) 중간 수정 완료 - 19개 파일 shared/로 이동
22 Android ProGuard/R8 설정 중간 수정 완료 - minify+shrink 활성화, proguard-rules.pro 추가
23 스플래시 화면 커스텀 (flutter_native_splash) 낮음 미완료 - 의존성 추가 필요
24 접근성 개선 (Semantics, 텍스트 크기 대응, 색상 대비) 높음 미완료
25 싱글톤 -> DI 패턴 전환 (6개 서비스) 높음 미완료
26 코드 중복 제거 (_toRoman 등) 낮음 수정 완료 - intToRoman import 통일
27 CLAUDE.md 현행화 (원본 충실도 방향 재정립) 낮음 수정 완료
28 IAP 가격 조정 검토 ($9.99 -> $2.99~$4.99) 결정 사항 소유자 결정 필요
29 Crashlytics/분석 도구 도입 (출시 후 모니터링) 중간 미완료 - Firebase 설정 필요
30 키보드 네비게이션 강화 (macOS 빌드) 중간 미완료

9. 종합 평가

잘된 점

  • 핵심 게임 로직(PQ 알고리즘) 포팅 품질 우수
  • 독자적 세계관("디지털 판타지")으로의 창의적 재해석
  • 전투/스킬/보스 등 풍부한 확장 시스템 (13개 신규 시스템)
  • 개인정보 처리방침 3개국어 준비 완료
  • 앱 아이콘 전 플랫폼 생성 완료 (iOS/Android/macOS)
  • 네이밍 컨벤션 및 코드 구조 양호
  • 보안: 네트워크 직접 사용 없음, API 키 하드코딩 없음

즉시 해결 필요

  • 출시 차단: 누락된 플랫폼 설정모두 수정 완료
  • 출시 차단 잔여: 앱 스크린샷 미준비 (R7) - 소유자 작업 중
  • 수익화: iOS 광고 ID 미설정 (차후), IAP 스토어 상품 미등록 (소유자 작업 중)

전략적 결정 필요

  • CLAUDE.md의 "100% 동일 포팅" 목표 vs 현재 "스핀오프/리메이크" 실태 정립해결 완료 (CLAUDE.md 현행화)
  • 원작이 무료인 점을 감안한 수익 모델 최적화
  • 광고 제거 IAP 가격 결정 ($9.99 vs $2.99~$4.99)
  • PQ 원작 저작권 관련 법률 검토

이 리포트는 7개 전문 에이전트(코드 품질, 빌드/테스트, 출시 준비, 사업/수익화, 보안, 로컬라이제이션/접근성, 원본 충실도)가 병렬로 수행한 검사 결과를 종합한 것입니다.