PetAI WBS 6.0 QA·CI/CD·릴리즈
목표: 구현 완료 선언을 자동 테스트, 실제 Player 입력, 데이터 복구, 한국어와 배포 재현성으로 증명한다.
주 책임: QA/DevOps
협업: 모든 담당
핵심 원칙: 과거 로그 재사용 금지, 실제 build와 evidence lineage 유지
1. 테스트 층
| 층 |
검증 대상 |
대표 증거 |
| Domain unit |
관계·claim·날짜·merge 규칙 |
test report |
| Application integration |
result/action/event transaction |
fixture result |
| Persistence |
tmp·backup·corruption·migration |
file hash·test |
| Content validation |
schema·reference·condition |
validator output |
| EditMode |
Unity 독립 로직 |
최신 XML |
| PlayMode |
scene·UI·resource 흐름 |
최신 XML |
| Player manual |
물리 입력·레이아웃·재실행 |
영상·캡처·state diff |
| Device/performance |
frame·memory·thermal·AI latency |
profiler·기기표 |
| Language/accessibility |
한국어·잘림·색·무음 |
review sheet |
| CI/CD |
clean checkout→artifact |
workflow run·hash |
2. 작업분해구조
| WBS |
작업 |
우선 |
선행 |
산출물 |
수용 기준 |
| 6.1.1 |
Test plan·traceability |
P0 |
기능 범위 |
requirement→case map |
IN 기능 누락 0 |
| 6.1.2 |
EditMode suite |
P0 |
domain |
XML·failure logs |
latest 100% pass |
| 6.1.3 |
PlayMode suite |
P0 |
scene builder |
XML·capture |
latest 100% pass |
| 6.1.4 |
Player smoke |
P0 |
fresh build |
launch/home/result |
crash 0 |
| 6.2.1 |
Success manual |
P0 |
playable build |
uninterrupted video |
state expected |
| 6.2.2 |
Failure manual |
P0 |
playable build |
uninterrupted video |
no relationship loss |
| 6.2.3 |
Restart persistence |
P0 |
result save |
before/after diff |
duplicate reward 0 |
| 6.2.4 |
Recovery manual |
P0 |
corrupt fixtures |
restore/export/fresh |
source preserved |
| 6.3.1 |
Responsive layout |
P0/P1 |
screens |
360×780,390×844,430×932 |
overlap 0 |
| 6.3.2 |
Offline matrix |
P0/P1 |
adapters |
AI/backend/weather off |
core loop complete |
| 6.3.3 |
Language QA |
P0/P1 |
content build |
screenshot+review |
P0/P1 Korean issue 0 |
| 6.4.1 |
Repository policy |
P2 |
canonical root |
ignore/LFS/attributes |
generated files excluded |
| 6.4.2 |
GitHub Actions |
P2 |
CLI tests/build |
PR workflow |
clean runner pass |
| 6.4.3 |
Build artifact |
P2 |
signing policy |
app/archive+hash |
source commit trace |
| 6.4.4 |
Fastlane |
CONDITIONAL |
manual iOS archive |
lanes·match policy |
TestFlight upload rehearsal |
| 6.5.1 |
Release report |
P2 |
all evidence |
versioned report |
blocker truth 유지 |
3. P0 수동 시나리오
QA-P0-A 신규 설치
- 기존 save가 없는 상태에서 실행한다.
- 권한 팝업 없이 첫 캐릭터 장면이 3초 내 나타난다.
- 첫인상 선택과 이름 생략을 수행한다.
- 홈에서 캐릭터와 가구를 실제 입력으로 구분한다.
- 첫 공동 놀이를 완료하고 결과·홈 변화·추억을 확인한다.
QA-P0-B 실패와 재도전
- 공동 놀이에서 장르 adapter의 실패 결과를 만든다.
- 친밀도 감소가 없고 실패를 숨기지 않는 문장을 확인한다.
- 홈 또는 재도전을 선택한다.
- 이전 결과가 손상되지 않고 claim이 중복되지 않는지 확인한다.
QA-P0-C 프로세스 재실행
- 결과 저장 직후 앱을 정상 종료한다.
- 프로세스 종료를 확인하고 다시 실행한다.
- 관계, 진행, keepsake, 대표 추억을 이전 캡처와 비교한다.
- 재실행만으로 보상이 다시 지급되지 않는지 확인한다.
QA-P0-D 양쪽 저장 손상
- primary와 backup을 각기 파싱 불가능 fixture로 교체한다.
- 앱이 Recovery로 진입하고 gameplay autosave가 멈추는지 확인한다.
- export가 원본을 바꾸지 않는지 hash로 확인한다.
- fresh start 첫 클릭은 경고만, 두 번째 확인만 새 active save를 만드는지 확인한다.
- 손상 원본이
.corrupt-* 형태로 남는지 확인한다.
4. 버그 심각도
| 등급 |
기준 |
예 |
| P0 |
데이터 손실·진행 불가·개인정보 유출 |
corrupt save 덮어쓰기, 원문 전송 |
| P1 |
핵심 가설 검증 불가 |
홈 입력 불가, 결과 중복, 사건 재개 실패 |
| P2 |
기능은 되지만 오해·불편 큼 |
거절이 관계 손실처럼 보임, UI 겹침 |
| P3 |
polish |
경미한 간격, 드문 표현 반복 |
P0는 릴리즈 즉시 중단, P1은 해당 Gate 통과 금지다. P2를 알려진 문제로 허용하려면 사용자 영향과 임시 대응을 릴리즈 문서에 적는다.
5. GitHub Actions 파이프라인
pull_request
→ secret/absolute-path scan
→ content/contract validation
→ C# formatting/static checks
→ EditMode tests
→ PlayMode tests
→ build dry run or licensed runner build
→ artifact manifest + hashes
- Unity licensing 실패와 test 실패를 같은 상태로 합치지 않는다.
- XML이 생성되지 않은 run은 PASS로 재해석하지 않는다.
- 과거 날짜 XML·build log를 최신 변경 증거로 재사용하지 않는다.
- runner와 local Unity patch version을 일치시킨다.
- source asset과 build artifact를 분리 보존한다.
6. Fastlane·배포
| 단계 |
선행 |
산출물 |
중단 조건 |
| manual archive |
iOS settings·signing |
검증된 .ipa/.xcarchive |
로컬 archive 실패 |
| lane init |
archive 재현 |
Fastfile/Appfile |
secret hardcode |
| signing |
team policy |
match/manual ADR |
권한 불명 |
| TestFlight upload |
release candidate |
build number·upload log |
QA blocker |
| staged test |
tester group |
feedback·crash |
P0/P1 발견 |
Fastlane은 수동 build 문제를 해결하는 도구가 아니다. 동일 source로 수동 archive가 성공한 뒤 자동화한다.
7. 릴리즈 증거 패키지
- commit SHA 또는 source snapshot hash
- Unity version과 package lock
- fresh EditMode·PlayMode XML
- fresh build log와 artifact hash
- success·failure·restart·recovery 수동 영상
- 기기·OS·화면 크기·입력 장치
- content bundle version/hash
- schema version과 migration matrix
- known issue와 severity
- privacy/network capture
- 승인자와 시간
8. 릴리즈 체크리스트
기능
- 기능 범위
IN 항목 전부 trace됨
OUT 기능이 UI·데이터·API에 숨어 있지 않음
- 리듬게임 미정 수치가 제품 승인값으로 표시되지 않음
데이터
- 정상·손상·future schema·양쪽 손상 검증
- delete/export/restore가 원본과 정책 일치
- AI·backend가 local authority를 덮지 않음
경험
- 실패·거절·부재 관계 압박 없음
- 한국어 P0/P1 문제 없음
- 390×844와 인접 두 화면에서 겹침 없음
운영
- 새 build와 새 test evidence
- secret scan 0건
- rollback 경로와 담당자
- team handoff가 canonical root만 참조
9. 연결 문서
11. 2026-07-23 기능 범위 QA 보완
| WBS |
검증 여정 |
합격 기준 |
| 6.6.1 |
튜토리얼 중단·재개·계정 연결 |
중복 지급 없이 마지막 완료 단계 다음부터 재개 |
| 6.6.2 |
권한 거절/철회 |
알림·위치·건강 권한 off에서도 핵심 게임 완주 |
| 6.6.3 |
스트레스·회복 |
원시 값/음수/최대치에서도 보상 하한과 회복 카피가 일관 |
| 6.6.4 |
도감·한정·히든 |
소유/미소유 filter, 종료 정책, 공정한 힌트, 기능 아이템 표시 |
| 6.6.5 |
구매·복원·환불 |
중복 entitlement 0건, 방/복장 반영과 복원 상태 일치 |
| 6.6.6 |
위젯·푸시 |
category off, quiet hours, stale snapshot, invalid deep link, offline fallback |
| 6.6.7 |
친구 안전 |
수락 전 접근 차단, 차단/삭제 후 모든 entry point 차단, 신고 기록 |
| 6.6.8 |
데이터 경계 |
network/log/widget/backup에 memory body·health raw·exact location 0건 |
11.1 릴리즈 차단 조건
- 권한 off가 핵심 게임 진행을 막음
- 푸시 opt-out·조용한 시간 위반
- 한정 상품의 종료/재등장 정책 누락
- 구매 복원·환불 뒤 entitlement/방 상태 불일치
- 친구 차단 뒤 snapshot·푸시·딥링크 중 하나라도 접근 가능
- 대화 원문, 건강 원본, 정확 위치가 서버·로그·위젯·백업으로 유출
상세 기준은 최종 기능 정의서를 따른다.