docs: CLAUDE.md 작업 프로토콜 추가 및 수정 계획 작성

- CLAUDE.md: Claude-Gemini 교차 토론 프로토콜 추가
- CLAUDE.md: 존재하지 않는 디렉토리 3개 제거
- analysis/fix-plan: 4 Phase 수정 계획 (Claude-Gemini 합의)
- .claude/agents/: dev 리뷰 에이전트 9개 복사
- .claude/skills/: 프로젝트 스킬 4개 복사
This commit is contained in:
JiWoong Sul
2026-03-27 16:52:52 +09:00
parent 6f5b3ba8f4
commit 916a50992c
17 changed files with 1672 additions and 3 deletions

View File

@@ -0,0 +1,226 @@
# 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분*