adpolicylisted
Install: claude install-skill snwlee/Nereus
# adpolicy
nereus:common 규칙을 따른다. 담당 에이전트: ads-engineer.
**엔진·프레임워크와 무관하다** — Flutter 든 Unity 든 네이티브든 정지 사유는 같다.
광고는 **가장 위험하고 가장 조용한 코드**다. 정책을 어기면 계정이 정지되고,
정지는 그 앱 하나가 아니라 **계정에 달린 앱 전부**를 멈춘다. 그리고 어기는 순간에는
아무 에러도 나지 않는다 — 빌드는 초록이고 광고는 잘 보인다.
## 0. 이 스킬은 게이트다
| | 이 스킬(`adpolicy`) | `adrevenue` |
|---|---|---|
| 낸다 | `violations` | `levers` · `unanswerable` |
| 뜻 | 정지 위험. 고치지 않으면 안 된다 | 돈을 더 벌 여지. 사업 판단이다 |
| 검사기 | `lib/ad-policy-check.mjs` | `lib/ad-funnel.mjs` |
`Ruling: 게이트와 조언자는 파일을 나눈다` 의 적용이다. 한 곳에서 같이 내면
"정지 위험"이 "배너 단가 좀 낮음" 옆에 나란히 붙어 진짜가 묻힌다.
## 1. 원칙 — 안전 처방은 노출을 줄이지 않는다
`Ruling: 광고 안전 처방은 노출을 줄이지 않는 형태여야 한다.`
"전면 광고를 덜 띄우세요"는 지켜지지 않는다. 수익이 바로 떨어지는 것이 보이기 때문이다.
지켜지지 않는 게이트는 **꺼진다**. 그래서 이 스킬의 모든 처방은
**무엇을 언제 어떤 단위로** 바꿀 것인가이지, 몇 건을 포기할 것인가가 아니다.
첫 세션 보호만이 예외로 보이지만 그것도 아니다 — 첫 세션은 **어차피 수익이 안 난다**.
미루면 D1 리텐션이 오르고, 오른 리텐션이 둘째 세션부터 노출을 더 만든다. 양쪽으로 이득이다.
## 2. 상태를 JSON 으로 적는다
축은 전부 **선택**이다. 주지 않은 축은 **검사하지 않는다** —
모르는 것과 통과한 것을 같게 보고하면 검사되지 않은 것이 통과로 읽힌다.
```json
{
"build": { "debug": false },
"units": [{ "format": "interstitial", "platform": "android", "resolvedId": "ca-app-pub-…/…" }],
"plan": { "formats": ["interstitial", "rewarded"] },
"session": { "launchCount": 0, "protectionEnabled": true },
"consent": { "initBeforeConsent": false, "skippedForConsent": ["fixedBanner"], "retryRegistered": ["fixedBanner"] },
"targeting": {
"fixedBanner": { "keywords": ["wallpaper", "kpop"], "contentUrl": "https://example.com" },
"rewarded"