Files
asciinevrdie/analysis/full-audit-2026-03-27.md
JiWoong Sul 916a50992c docs: CLAUDE.md 작업 프로토콜 추가 및 수정 계획 작성
- CLAUDE.md: Claude-Gemini 교차 토론 프로토콜 추가
- CLAUDE.md: 존재하지 않는 디렉토리 3개 제거
- analysis/fix-plan: 4 Phase 수정 계획 (Claude-Gemini 합의)
- .claude/agents/: dev 리뷰 에이전트 9개 복사
- .claude/skills/: 프로젝트 스킬 4개 복사
2026-03-27 16:52:52 +09:00

12 KiB

Askii Never Die - Full Project Audit Report

분석일: 2026-03-27 분석 도구: 9개 개발 리뷰 에이전트 (Claude-Gemini 교차 토론 적용) 프로젝트: Askii Never Die (오프라인 방치형 Idle RPG, Flutter) 규모: 61,000 LOC / 224개 Dart 파일 / 247개 테스트 (전부 통과)


Project Health Score: 49 / 100

# 영역 점수 가중치 가중 점수 핵심 이슈
1 Architecture 5/10 15% 7.5 인터페이스 0개, DI 부재, 싱글톤 6개, 엔진에 프레임워크 직접 의존
2 Code Quality 6/10 15% 9.0 200 LOC 초과 47.6%, God Widget 2개, 100% 중복 파일 1쌍
3 Security 5/10 15% 7.5 IAP 로컬 영수증 검증 미구현, 세이브 무결성 없음, 구매 상태 평문 저장
4 Performance 7/10 10% 7.0 매 50ms setState 전체 리빌드, 서비스 객체 반복 생성, SFX 캐싱 부재
5 Test Coverage 5/10 10% 5.0 파일 커버리지 10%, 저장/전투틱/Model 직렬화 테스트 전무
6 Supply Chain 6/10 10% 6.0 폰트 라이선스 미포함, google_mobile_ads 2 메이저 뒤처짐
7 Docs Sync 5/10 5% 2.5 CLAUDE.md에 존재하지 않는 디렉토리 3개, README 극빈약
8 DevOps 2/10 10% 2.0 CI/CD 완전 부재, 릴리즈 프로세스 미정립
9 Idea Alignment 22/100 10% 2.2 완전 피벗 (RPS 격투 -> Idle RPG), 피벗 후 시장 재분석 없음
합계 100% 48.7

점수 해석: 49점대는 "동작하는 프로토타입~알파" 수준. 제품으로서 기능하지만 프로덕션 배포에 필요한 품질/운영 기반이 미비.

참고: Keystore Git 노출은 개인 Git 서버에서 사용자가 허가한 사항이므로 이슈에서 제외. IAP는 서버가 없는 구조이므로 로컬 검증 강화 방안으로 조정.


CRITICAL Issues (즉시 조치 필요)

1. CI/CD 파이프라인 완전 부재 [DevOps]

  • 영향: 빌드/테스트/린트 모두 수동. 깨진 코드 push 가능
  • 조치: Gitea Actions 또는 GitHub Actions로 dart format + flutter analyze + flutter test 자동화
  • 예상 공수: 반나절

2. AdMob 미디에이션 미구현 [Idea Alignment + Security]

  • 영향: AdMob 계정 정지 = 수익 즉시 소멸 (인디 개발자 가장 흔한 수익 소멸 시나리오)
  • 조치: AppLovin MAX 또는 IronSource 연동
  • 예상 공수: 2-3일

HIGH Issues (단기 조치)

3. IAP 로컬 영수증 서명 검증 미구현 [Security]

  • 파일: lib/src/core/engine/iap_service.dart:332-336
  • 영향: 서버 없이도 로컬 서명 검증으로 캐주얼 크래킹(Lucky Patcher 등) 방어 가능
  • 조치:
    • Google Play: purchase.verificationData.localVerificationData에서 서명된 JSON 추출 -> Google Play Console의 공개 키(Base64 RSA)로 RSASSA-PKCS1-v1_5 + SHA1 서명 검증. pointycastle 패키지 활용
    • Apple: StoreKit 2의 JWS(JSON Web Signature) 토큰을 로컬에서 Apple 루트 인증서로 검증
    • 구매 상태 저장: shared_preferences -> flutter_secure_storage (Android Keystore / iOS Keychain)
  • 공수: 1-2일
  • 한계: 루팅+후킹 조합 공격은 로컬 검증으로 완전 차단 불가. 그러나 90%+ 캐주얼 크래킹 방어 가능

4. 구매 상태 평문 저장 [Security]

  • 파일: iap_service.dart:65-66, monetization_state.dart:17-45
  • 조치: shared_preferences -> flutter_secure_storage 전환 (3번 작업과 동시 진행)
  • 공수: 반나절

5. 세이브 파일 무결성 없음 [Security]

  • 파일: save_service.dart:17-20
  • 조치: HMAC-SHA256 체크섬 추가. 키는 앱 번들에 난독화 포함
  • 공수: 반나절

6. Analytics 부재 [Idea Alignment]

  • 영향: DAU, 리텐션, 광고 시청률, IAP 전환율 측정 불가
  • 조치: Firebase Analytics 또는 PostHog 연동
  • 공수: 1일

7. 인터페이스 0개 + DI 부재 [Architecture]

  • 영향: 테스트 격리 불가, 싱글톤 6개로 모킹 원천 봉쇄
  • 조치: GetIt 또는 생성자 주입 도입, 핵심 서비스 abstract class 정의
  • 공수: 3-5일 (점진적)

8. 매 50ms 전체 위젯 setState [Performance]

  • 파일: game_play_screen.dart:352-368
  • 영향: 모바일 프레임 드롭 원인 1순위
  • 조치: ValueNotifier/Selector로 세분화된 상태 관리
  • 공수: 1-2일

9. 저장 시스템 테스트 전무 [Test Coverage]

  • 파일: save_repository.dart, save_service.dart, save_manager.dart (6개 파일 모두)
  • 영향: 세이브 파일 손상 시 플레이어 데이터 영구 손실
  • 조치: IOOverrides/임시 디렉토리 기반 저장/로드/삭제 테스트 작성
  • 공수: 1일

MEDIUM Issues (중기 개선)

10. 폰트 라이선스 파일 미포함 [Supply Chain]

  • JetBrainsMono (OFL), PressStart2P (OFL) LICENSE 파일 assets/fonts/에 추가 필수

11. google_mobile_ads 5.3.0 -> 7.0.0 업그레이드 [Supply Chain]

  • iOS Privacy Manifest 미대응으로 App Store 심사 거절 리스크

12. God Widget 2개 분할 [Code Quality]

  • game_play_screen.dart (736 LOC), arena_battle_screen.dart (759 LOC)

13. progress_service.dart 832 LOC 분할 [Code Quality]

  • Quest/Plot/Exp/Combat 서비스로 분리

14. 100% 중복 파일 제거 [Code Quality]

  • features/arena/widgets/ascii_disintegrate_widget.dart 삭제 (shared/ 버전 사용)

15. CLAUDE.md 디렉토리 구조 수정 [Docs Sync]

  • core/animation/ -> shared/animation/, core/constants/ 삭제, core/l10n/ -> shared/l10n/

16. README 전면 재작성 [Docs Sync]

  • 현재 프로젝트 초기 임시 메모 수준. 6개 화면, 수익화, 다국어 지원 등 전혀 반영 안 됨

17. 크래시 리포팅 도입 [DevOps]

  • Firebase Crashlytics 또는 Sentry

18. 엔진 계층 프레임워크 오염 제거 [Architecture]

  • ad_service.dart, iap_service.dart 등을 core/infrastructure/로 이동

19. 피벗 후 시장 재분석 [Idea Alignment]

  • "오프라인 Idle RPG + ASCII 아트" 시장 분석이 전무. idea-market-intel 재실행 필요

LOW Issues (장기)

  • cupertino_icons 미사용 제거 (~280KB 절약)
  • SFX 에셋 프리로드 및 캐싱
  • 모바일 포그라운드 복귀 시 전체 화면 재생성 최적화
  • gcd_simulation_test/balance_analysis_test를 실제 assert 포함 테스트로 전환
  • analysis_options.yaml lint rule 추가 (prefer_const_constructors, prefer_final_locals 등)
  • CHANGELOG에 실제 릴리즈 이력 기록
  • Model 직렬화 라운드트립 테스트 작성

Fix Plan (Eisenhower Matrix)

                    긴급 (Urgent)              비긴급 (Not Urgent)
                ┌──────────────────────────┬──────────────────────────┐
   중요          │ DO FIRST (즉시)           │ SCHEDULE (계획)          │
   (Important)  │                          │                          │
                │ 1. CI/CD 구축            │ 7. 인터페이스+DI 도입     │
                │ 2. AdMob 미디에이션      │ 12. God Widget 분할      │
                │ 3. IAP 로컬 서명 검증    │ 13. progress_service 분할│
                │ 4. 구매 상태 보안 저장   │ 18. 엔진 프레임워크 분리 │
                │ 5. 세이브 무결성 추가    │ 19. 피벗 후 시장 재분석  │
                │ 10. 폰트 라이선스 추가   │ 17. 크래시 리포팅 도입   │
                ├──────────────────────────┼──────────────────────────┤
   덜 중요      │ DELEGATE (위임 가능)     │ ELIMINATE (후순위)       │
   (Less        │                          │                          │
    Important)  │ 6. Analytics 연동        │ 14. 중복 파일 제거       │
                │ 8. setState 세분화       │ 15. CLAUDE.md 수정       │
                │ 9. 저장 시스템 테스트    │ 16. README 재작성        │
                │ 11. google_mobile_ads 7.x│ + LOW 이슈 전체          │
                └──────────────────────────┴──────────────────────────┘

실행 로드맵 (권장 순서)

Phase 1: 보안 강화 + DevOps 기반 (2-3일)

1. CI 파이프라인 구축 (dart format + analyze + test) → verify: push 시 자동 실행
2. 폰트 라이선스 파일 추가 → verify: assets/fonts/에 LICENSE.txt 존재
3. IAP 로컬 영수증 서명 검증 구현 (Google Play 공개키 RSA 검증) → verify: 검증 실패 시 구매 거부 테스트
4. 구매 상태 flutter_secure_storage 전환 → verify: 기존 테스트 통과
5. 세이브 파일 HMAC 체크섬 추가 → verify: 변조된 세이브 로드 거부 테스트

Phase 2: 수익 보호 (3-5일)

1. AdMob 미디에이션 연동 (AppLovin MAX) → verify: AdMob 비활성 시 백업 네트워크 로드
2. google_mobile_ads 7.x 마이그레이션 → verify: iOS Privacy Manifest 포함 확인
3. CHANGELOG 정리 + 버전 태그 체계 수립 → verify: git tag 존재

Phase 3: 아키텍처 개선 (1-2주, 점진적)

1. 핵심 서비스 인터페이스 정의 (SaveRepository, AdService, IAPService)
2. DI 컨테이너(GetIt) 도입
3. ad_service, iap_service를 core/infrastructure/로 이동
4. GamePlayScreen setState 세분화
5. 저장 시스템 테스트 작성

Phase 4: 콘텐츠/성장 (2주+)

1. Firebase Analytics 연동
2. Crashlytics 연동
3. 피벗 후 시장 재분석 (idea-market-intel 실행)
4. Web meta 태그 수정 + ASO 최적화
5. README / CLAUDE.md / ARCHITECTURE.md 동기화

에이전트별 상세 리포트 참조

에이전트 점수 주요 발견
Architecture 5/10 인터페이스 0개, 싱글톤 6개, core/engine/ Flutter 오염 6파일, app.dart God Class 459 LOC
Code Quality 6/10 dart format/analyze 통과, 200 LOC 초과 100개(47.6%), God Widget 2개, var 31회 남용
Security 5/10 IAP 로컬 서명 검증 미구현, 세이브 무결성 없음, 구매 상태 평문 저장
Supply Chain 6/10 CVE 0, GPL 0, 폰트 라이선스 미포함, google_mobile_ads 2메이저 뒤처짐
Performance 7/10 50ms setState 전체 리빌드, 서비스 객체 매틱 재생성, SFX 캐싱 부재, RepaintBoundary 활용 양호
Test Coverage 5/10 247개 테스트 전통과, 파일 커버리지 10%, 저장/전투틱/Model 직렬화 테스트 전무
Docs Sync 5/10 CLAUDE.md 존재하지 않는 경로 3개, README 극빈약, CHANGELOG 릴리즈 이력 없음
DevOps 2/10 CI/CD 완전 부재, 릴리즈 프로세스 미정립, Crashlytics 없음
Idea Alignment 22/100 완전 피벗 (RPS -> Idle RPG), 수익화만 일치, 피벗 후 시장 재분석 없음, Analytics 부재

제외된 이슈

이슈 제외 사유
Keystore + 비밀번호 Git 노출 개인 Git 서버(Gitea)에서 사용자가 허가한 운영 방식
IAP 서버 측 영수증 검증 서버 없는 오프라인 앱 구조. 로컬 서명 검증으로 대체 권고

이 보고서는 Claude-Gemini 교차 토론을 통해 합의된 결과입니다. 9개 에이전트 병렬 실행, 총 분석 시간: ~6분