billing-integritylisted
Install: claude install-skill ezBuilder/code-brain
# 결제 무결성
결제는 **실패해도 사용자가 항의하지 않는 방향**으로 무너진다. 권한이 조용히 사라지거나,
검증이 조용히 통과하거나, 원장이 조용히 비어 있다. 그래서 "동작하는 것처럼 보이는 상태"가
가장 위험하다. 이 스킬은 실제 운영 사고에서 역산한 항목만 담는다.
## 핵심 원칙 6
1. **조용한 실패 금지.** 모든 실패 경로는 소리를 낸다(로그+운영자 알림).
2. **권한은 회수보다 유지가 안전하다.** 조회 실패·불확실 상태에서 절대 회수하지 않는다.
3. **스토어 알림은 반드시 유실된다고 가정한다.** 웹훅은 보조, 폴링이 진짜 원장이다.
4. **모든 지급/차감은 멱등키를 가진다.** 사용자 식별자를 키에 포함한다.
5. **집행 판정은 서버가 사실 기반으로.** 클라이언트 입력은 티어에 영향을 주지 못한다.
6. **정상 판정은 폐쇄루프 증거로.** HTTP 200이나 콘솔 저장 성공만으로 끝내지 않고,
스토어 테스트 알림이 인증된 전송 경로를 거쳐 운영 인박스에 도착하는지 확인한다.
## 언제 무엇을 하나
### 새로 결제를 붙일 때
이 순서를 지킨다. 2~4를 나중으로 미루면 반드시 사고로 돌아온다.
1. 상품 카탈로그를 서버 단일 소스로 정의(productId, kind, 가격, 부여 게이트)
2. **재검증용 원문 보관 설계** — 해시만 저장하면 나중에 복구가 불가능해진다
3. **멱등키 설계** — 이벤트 append-only + 유니크 인덱스
4. **리컨사일 폴링** — 웹훅보다 이게 원장이다
5. 부팅 시크릿 검증 + 운영자 알림
6. 웹훅 수신 + 인박스 + 미처리/무수신 감시
7. 만료 앵커 불변식 + 결제 실패 유예 정책
8. 티어·게이트 판정 서버화
9. 구매 복원 + 판매중단 SKU 화이트리스트
10. 웹훅 폐쇄루프 검증: topic + push 구독 + 인증 + 운영 인박스
11. 레거시 재검증 토큰 보유율 측정 + 백필 계획
12. 회귀 테스트: SKU kind 라우팅, 멱등 중복, 티어 폴백, 유예 판정
13. 쿼터 정책 변경 시 저장된 운영 설정을 마이그레이션하거나 읽기 단계에서 정책 정규화
14. 광고 단위의 콘솔 포맷과 SDK 로더 타입(Rewarded/Rewarded Interstitial)을 실기기에서 대조
15. 양 스토어의 SKU 판매 상태와 스토어 설치 실기기 상품 조회를 각각 확인
상세는 `references/playbook.md`를 읽는다.
### 기존 결제를 감사할 때
`references/audit.md`의 절차를 따른다. 코드만 보지 말고 **인프라 설정과 운영 데이터**를
함께 확인해야 한다 — 코드가 완벽해도 웹훅 엔드포인트 설정이 죽어 있을 수 있다.
### 결제 사고가 났을 때
1. **범위 파악** — 몇 명이 영향받았나. DB로 센다. 추측 금지.
2. **권한 부여 방향으로 먼저 구제** — 회수는 나중에. 사용자 이탈이 가장 비싸다.
3. **복구 스크립트는 멱등하게** — dry-run 기본, `--apply` 명시,