{
  "generated": "2026-08-26T02:42:01.371Z",
  "rules": [
    {
      "docId": "coupang-campaign-types",
      "section": "coupang",
      "id": "coupang-new-sku-start-type",
      "when": "신규 등록 상품이고 광고 이력 데이터가 없음",
      "metric": "days_since_ad_start",
      "condition": "== 0",
      "action": "매출최적화 또는 매출스타트 광고로 시작, 일예산 3만원 이상 설정 제안",
      "guardrail": "수동성과형으로 즉시 시작 금지 (데이터 없이 키워드 선정 불가)",
      "confidence": "medium"
    },
    {
      "docId": "coupang-campaign-types",
      "section": "coupang",
      "id": "coupang-migrate-to-manual",
      "when": "자동 광고 운영 14일 이상 & 특정 키워드 ROAS가 손익분기 이상으로 안정",
      "metric": "days_running,roas_14d",
      "condition": ">= 14 AND >= breakeven_roas",
      "action": "해당 키워드를 수동성과형 캠페인으로 이관 제안(사람 확인 필요)",
      "guardrail": "이관 후에도 자동 캠페인은 신규 키워드 발굴용으로 유지",
      "confidence": "medium"
    },
    {
      "docId": "coupang-bidding",
      "section": "coupang",
      "id": "coupang-bid-down-below-breakeven",
      "when": "키워드 ROAS_7d가 손익분기 ROAS 미만이고 광고비가 유의미하게 집행됨",
      "metric": "roas_7d",
      "condition": "< breakeven_roas",
      "action": "입찰가 15~20% 인하 제안",
      "guardrail": "일 1회 한도, 조정 후 3일 재관찰 전 재조정 금지, 최저 입찰가 100원 미만 금지",
      "confidence": "medium"
    },
    {
      "docId": "coupang-bidding",
      "section": "coupang",
      "id": "coupang-bid-up-headroom",
      "when": "키워드 ROAS_7d가 손익분기 ROAS + 100%p 이상이고 노출수가 목표 대비 낮음",
      "metric": "roas_7d,impressions_7d",
      "condition": ">= breakeven_roas+100 AND < target_impressions",
      "action": "입찰가 10~20% 인상 제안",
      "guardrail": "1회 인상 상한 20%, 최대 입찰가 10만원 초과 금지",
      "confidence": "medium"
    },
    {
      "docId": "coupang-bidding",
      "section": "coupang",
      "id": "coupang-target-roas-too-low",
      "when": "자동 광고 목표 ROAS 설정값이 손익분기 ROAS보다 낮음",
      "metric": "target_roas_setting",
      "condition": "< breakeven_roas",
      "action": "목표 ROAS를 손익분기+50%p 이상으로 상향 제안",
      "guardrail": "설정 변경 전 사람 확인 필수(광고 노출량 급감 가능)",
      "confidence": "high"
    },
    {
      "docId": "coupang-negative",
      "section": "coupang",
      "id": "coupang-exclude-irrelevant",
      "when": "키워드가 상품 카테고리·속성과 명백히 무관 (수동 태깅 또는 룰 매칭)",
      "metric": "relevance_flag",
      "condition": "== irrelevant",
      "action": "제외키워드 즉시 등록 제안",
      "guardrail": "사람 확인 후 등록, 브랜드명 오탐 여부 재확인",
      "confidence": "medium"
    },
    {
      "docId": "coupang-negative",
      "section": "coupang",
      "id": "coupang-exclude-no-conversion",
      "when": "최근 7일 클릭 10회 이상 & 전환 0건",
      "metric": "clicks_7d,conversions_7d",
      "condition": ">=10 AND ==0",
      "action": "제외키워드 등록 제안",
      "guardrail": "신상품 런칭 후 14일 이내는 제외 보류(오가닉 데이터 부족)",
      "confidence": "medium"
    },
    {
      "docId": "coupang-negative",
      "section": "coupang",
      "id": "coupang-exclude-persistent-loss",
      "when": "ROAS_daily < breakeven_roas가 3일 연속",
      "metric": "roas_daily_streak_below_breakeven",
      "condition": ">= 3",
      "action": "1차 입찰가 20% 인하, 인하 후 3일 더 미달 시 제외키워드 등록",
      "guardrail": "일 1회 조치, 단일 액션 후 최소 3일 관찰",
      "confidence": "medium"
    },
    {
      "docId": "coupang-negative",
      "section": "coupang",
      "id": "coupang-exclude-impression-no-click",
      "when": "최근 7일 노출 200회 이상 & 클릭 0",
      "metric": "impressions_7d,clicks_7d",
      "condition": ">=200 AND ==0",
      "action": "상품 무관 가능성 높음, 제외키워드 검토 알림",
      "guardrail": "썸네일/제목 CTR 문제와 구분 필요, 자동 등록 금지(알림만)",
      "confidence": "low"
    },
    {
      "docId": "coupang-launch",
      "section": "coupang",
      "id": "coupang-launch-aggressive-start",
      "when": "상품 등록 후 14일 이내 & 광고 이력 없음",
      "metric": "days_since_launch",
      "condition": "<= 14",
      "action": "매출최적화/매출스타트 광고로 시작, 목표 ROAS를 손익분기보다 낮게 설정해 공격적 노출 확보 제안",
      "guardrail": "일 예산 상한을 사전 설정해 무제한 소진 방지, 14일 경과 시 재평가 알림",
      "confidence": "low"
    },
    {
      "docId": "coupang-launch",
      "section": "coupang",
      "id": "coupang-launch-no-early-kill",
      "when": "상품 등록 후 14일 미만 & ROAS가 손익분기 미달",
      "metric": "days_since_launch,roas",
      "condition": "< 14 AND < breakeven_roas",
      "action": "광고 중단/입찰가 대폭 인하 액션 보류, 관찰만 지속",
      "guardrail": "14일 경과 전 자동 손절 액션 생성 금지",
      "confidence": "medium"
    },
    {
      "docId": "coupang-launch",
      "section": "coupang",
      "id": "coupang-launch-review-pace-check",
      "when": "1일간 리뷰 증가량이 최근 7일 평균의 5배 이상",
      "metric": "review_delta_1d_vs_avg7d",
      "condition": ">= 5x",
      "action": "리뷰 급증 알림 — 부자연스러운 몰림 여부 확인 제안",
      "guardrail": "자동 조치 없음, 사람 확인 전용 알림",
      "confidence": "low"
    },
    {
      "docId": "coupang-report",
      "section": "coupang",
      "id": "coupang-classify-loss",
      "when": "키워드 ROAS_7d < 손익분기 ROAS",
      "metric": "roas_7d",
      "condition": "< breakeven_roas",
      "action": "적자로 분류, 입찰가 인하 또는 제외키워드 후보 등록",
      "guardrail": "분류 갱신은 일 1회, 신상품 14일 이내는 분류 보류",
      "confidence": "high"
    },
    {
      "docId": "coupang-report",
      "section": "coupang",
      "id": "coupang-classify-watch",
      "when": "손익분기 ROAS ≤ ROAS_7d < 손익분기 ROAS+100%p",
      "metric": "roas_7d",
      "condition": ">= breakeven_roas AND < breakeven_roas+100",
      "action": "관망으로 분류, 조치 없이 관찰 유지",
      "guardrail": "관망 상태에서 자동 입찰 조정 금지",
      "confidence": "high"
    },
    {
      "docId": "coupang-report",
      "section": "coupang",
      "id": "coupang-classify-profit",
      "when": "ROAS_7d ≥ 손익분기 ROAS+100%p",
      "metric": "roas_7d",
      "condition": ">= breakeven_roas+100",
      "action": "수익으로 분류, 입찰가 인상 또는 예산 확대 제안",
      "guardrail": "인상 폭 20% 상한, 노출 목표 이미 충족 시 인상 보류",
      "confidence": "high"
    },
    {
      "docId": "coupang-report",
      "section": "coupang",
      "id": "coupang-roas-vat-adjust",
      "when": "리포트 ROAS 계산 시 광고비에 VAT 미반영",
      "metric": "ad_cost_raw",
      "condition": "vat_included == false",
      "action": "광고비 × 1.1로 환산 후 ROAS 재계산 제안",
      "guardrail": "표시용 재계산만, 원본 리포트 데이터는 보존",
      "confidence": "medium"
    },
    {
      "docId": "coupang-routine",
      "section": "coupang",
      "id": "coupang-daily-deviation-alert",
      "when": "당일 CTR, CVR, ROAS, 소진율 중 하나가 최근 7일 평균 대비 20% 이상 변동",
      "metric": "metric_delta_vs_avg7d",
      "condition": ">= 20% or <= -20%",
      "action": "이상 변동 알림 생성, 원인 확인 제안(썸네일/가격/재고/경쟁사)",
      "guardrail": "자동 조치 없음, 사람 확인 전용",
      "confidence": "medium"
    },
    {
      "docId": "coupang-routine",
      "section": "coupang",
      "id": "coupang-weekly-reclassify",
      "when": "매주 1회 정기 실행",
      "metric": "schedule",
      "condition": "== weekly",
      "action": "전체 키워드 적자/관망/수익 재분류 실행 및 변경분 리포트",
      "guardrail": "재분류 결과만 리포트, 입찰가 자동 변경은 별도 룰에서 처리",
      "confidence": "high"
    },
    {
      "docId": "coupang-routine",
      "section": "coupang",
      "id": "coupang-weekly-negative-candidate",
      "when": "키워드가 3일 연속 ROAS < 손익분기 ROAS",
      "metric": "roas_daily_streak_below_breakeven",
      "condition": ">= 3",
      "action": "제외키워드 후보 목록에 추가",
      "guardrail": "최종 등록은 사람 승인 후 실행 (03-negative-keywords.md 절차 따름)",
      "confidence": "medium"
    },
    {
      "docId": "coupang-routine",
      "section": "coupang",
      "id": "coupang-goldenhour-budget-check",
      "when": "18~21시 시간대 예산 소진 비중이 전체의 40% 미만",
      "metric": "goldenhour_budget_share",
      "condition": "< 40%",
      "action": "골든타임 예산 비중 상향 제안(탄력 일예산 또는 시간대별 입찰가 조정)",
      "guardrail": "카테고리별 실제 전환 피크 시간대와 비교 확인 후 적용",
      "confidence": "low"
    },
    {
      "docId": "coupang-routine",
      "section": "coupang",
      "id": "coupang-monthly-strategy-review",
      "when": "매월 1회 정기 실행",
      "metric": "schedule",
      "condition": "== monthly",
      "action": "AI/수동 예산 비율, 카테고리별 목표 ROAS, 시즌 예산 계획 재검토 알림",
      "guardrail": "자동 실행 없음, 리뷰 체크리스트 생성만",
      "confidence": "medium"
    },
    {
      "docId": "coupang-youtube-insights",
      "section": "coupang",
      "id": "coupang-new-revenue-opt-conservative-start",
      "when": "매출최적화광고 신규 생성 & 첫 집행",
      "metric": "campaign_age_days",
      "condition": "== 0",
      "action": "일예산 3~5만원, 목표 ROAS 300% 이하로 초기값 제안",
      "guardrail": "사람 확인 후 적용, 자동 상향 금지",
      "confidence": "low"
    },
    {
      "docId": "coupang-youtube-insights",
      "section": "coupang",
      "id": "coupang-price-over-recommended-alert",
      "when": "판매가가 권장가 대비 10% 초과",
      "metric": "price_vs_recommended_pct",
      "condition": "> 10",
      "action": "노출빈도 감소 위험 알림 (최대 60% 감소 사례 있음)",
      "guardrail": "가격 자동 변경 금지, 알림만 발송",
      "confidence": "low"
    },
    {
      "docId": "coupang-youtube-top100",
      "section": "coupang",
      "id": "coupang-mandatory-fields-block-ads",
      "when": "신규 상품 등록 시 브랜드/구매옵션/상품식별번호 미입력(2026-02-02 시행 정책)",
      "metric": "product_registration_status",
      "condition": "== 미승인 or 노출제한",
      "action": "광고 캠페인 생성 차단 및 필수정보 입력 알림",
      "guardrail": "사람 확인 후 등록 진행, 자동 입력 금지",
      "confidence": "high"
    },
    {
      "docId": "coupang-youtube-top100",
      "section": "coupang",
      "id": "coupang-target-roas-margin-check",
      "when": "목표 ROAS가 마진율 미반영 상태로 설정됨",
      "metric": "target_roas_vs_breakeven",
      "condition": "target_roas < breakeven_roas",
      "action": "목표 ROAS 재설정 알림(마진율 기준 하한 제시)",
      "guardrail": "자동 변경 금지, 알림만 발송",
      "confidence": "medium"
    },
    {
      "docId": "coupang-youtube-top100",
      "section": "coupang",
      "id": "coupang-item-not-winner-auto-price",
      "when": "아이템위너 상실 상태 지속",
      "metric": "item_winner_status",
      "condition": "== false",
      "action": "쿠팡Wing 자동 가격 조정 기능(최소가 설정) 활성화 검토 알림",
      "guardrail": "최소가는 마진 하한선 이상으로만 설정, 자동 실행 전 사람 승인",
      "confidence": "medium"
    },
    {
      "docId": "google-account-setup",
      "section": "google",
      "id": "google-conversion-sprawl-warning",
      "when": "주요(Primary) 전환 액션 개수가 5개 초과",
      "metric": "primary_conversion_action_count",
      "condition": "> 5",
      "action": "마이크로 전환을 보조(Secondary)로 강등하도록 경고",
      "guardrail": "구매/리드완료 등 매출 직결 액션은 강등 금지",
      "confidence": "high"
    },
    {
      "docId": "google-account-setup",
      "section": "google",
      "id": "google-enhanced-conversions-missing",
      "when": "향상된 전환 토글이 OFF 상태로 30일 이상 유지",
      "metric": "enhanced_conversions_enabled",
      "condition": "== false",
      "action": "향상된 전환 활성화 및 고객 데이터 약관 동의 안내",
      "guardrail": "개인정보 해시(SHA-256) 미적용 상태로 활성화 금지",
      "confidence": "high"
    },
    {
      "docId": "google-account-setup",
      "section": "google",
      "id": "google-ga4-link-missing",
      "when": "GA4-Google Ads 계정 링크 미연결 상태로 캠페인 라이브 중",
      "metric": "ga4_link_status",
      "condition": "== not_linked",
      "action": "GA4 링크 및 주요 이벤트 임포트 즉시 설정 권고",
      "guardrail": "없음 (설정 안내성 훅)",
      "confidence": "medium"
    },
    {
      "docId": "google-search",
      "section": "google",
      "id": "google-broad-match-insufficient-data",
      "when": "광범위 매치 키워드 포함 캠페인의 30일 전환수가 30건 미만",
      "metric": "conversions_30d",
      "condition": "< 30",
      "action": "광범위 매치 비중 축소, 구문/정확 매치로 전환 권고",
      "guardrail": "기존 고성과 광범위 키워드는 즉시 제외하지 말고 단계적 축소",
      "confidence": "high"
    },
    {
      "docId": "google-search",
      "section": "google",
      "id": "google-rsa-multiple-per-adgroup",
      "when": "광고그룹 내 활성 RSA 개수가 2개 이상",
      "metric": "active_rsa_count_per_adgroup",
      "condition": "> 1",
      "action": "저성과 RSA 일시정지, 데이터 통합",
      "guardrail": "A/B 테스트 목적의 임시 2개 운영은 최대 2주로 제한",
      "confidence": "medium"
    },
    {
      "docId": "google-search",
      "section": "google",
      "id": "google-rsa-asset-refresh-cadence",
      "when": "RSA 자산이 등록된 지 14일 미만인데 교체 시도",
      "metric": "days_since_asset_added",
      "condition": "< 14",
      "action": "교체 보류, 평가 데이터 누적 대기",
      "guardrail": "명백한 정책 위반/오탈자는 즉시 교체 예외",
      "confidence": "high"
    },
    {
      "docId": "google-search",
      "section": "google",
      "id": "google-adgroup-keyword-count",
      "when": "광고그룹 키워드 수가 SKAG 예외 목록 외에서 1개",
      "metric": "keyword_count_per_adgroup",
      "condition": "== 1",
      "action": "고가치 키워드(전환수 상위 20위 이내) 아니면 STAG로 재편 권고",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "google-pmax",
      "section": "google",
      "id": "google-pmax-assetgroup-low-conversion",
      "when": "자산그룹 월 전환수가 5건 미만",
      "metric": "conversions_30d_per_asset_group",
      "condition": "< 5",
      "action": "관련 자산그룹으로 병합",
      "guardrail": "신규 자산그룹 등록 후 14일 미만이면 병합 보류",
      "confidence": "high"
    },
    {
      "docId": "google-pmax",
      "section": "google",
      "id": "google-pmax-asset-rating-low",
      "when": "자산 평가가 '낮음(Low)'으로 7일 이상 유지",
      "metric": "asset_rating",
      "condition": "== low_for_7d",
      "action": "해당 자산 교체",
      "guardrail": "교체 후 2주 관찰 없이 재교체 금지",
      "confidence": "high"
    },
    {
      "docId": "google-pmax",
      "section": "google",
      "id": "google-pmax-brand-cannibalization",
      "when": "PMax 브랜드 검색어 노출 비중이 기존 검색 캠페인 대비 급증",
      "metric": "pmax_branded_impression_share",
      "condition": "> baseline * 1.3",
      "action": "브랜드 제외 리스트 추가",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "google-pmax",
      "section": "google",
      "id": "google-shopping-choose-standard",
      "when": "일예산이 10만원 미만이거나 SKU 50개 미만",
      "metric": "daily_budget_krw, sku_count",
      "condition": "daily_budget_krw < 100000 OR sku_count < 50",
      "action": "표준 쇼핑 캠페인 우선 운영 권고",
      "guardrail": "PMax 완전 배제는 아니며 병행 테스트는 허용",
      "confidence": "medium"
    },
    {
      "docId": "google-youtube",
      "section": "google",
      "id": "google-youtube-vac-legacy-flag",
      "when": "캠페인 유형이 여전히 '동영상 액션 캠페인(VAC)'으로 표기",
      "metric": "campaign_type",
      "condition": "== video_action_campaign",
      "action": "Demand Gen으로 마이그레이션 확인/실행",
      "guardrail": "자동 업그레이드 완료 계정은 중복 실행 금지",
      "confidence": "high"
    },
    {
      "docId": "google-youtube",
      "section": "google",
      "id": "google-youtube-skip-rate-high",
      "when": "5초 이내 스킵률이 계정 평균 대비 급증",
      "metric": "skip_rate_5s",
      "condition": "> account_avg * 1.2",
      "action": "훅(첫 3~5초) 소재 교체, 브랜드 노출 타이밍 앞당김",
      "guardrail": "동일 소재 7일 미만 데이터로 판단 금지",
      "confidence": "medium"
    },
    {
      "docId": "google-youtube",
      "section": "google",
      "id": "google-youtube-vtr-low",
      "when": "조회율(VTR)이 목표 대비 낮고 훅 구간에 로고/제품이 2초 이전 노출",
      "metric": "view_through_rate",
      "condition": "< target_vtr",
      "action": "첫 2초 로고/제품 클로즈업 제거, 패턴 인터럽트 요소 삽입",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "google-bidding",
      "section": "google",
      "id": "google-tcpa-insufficient-conversions",
      "when": "tCPA 전환을 시도하려는 캠페인의 30일 전환수가 30건 미만",
      "metric": "conversions_30d",
      "condition": "< 30",
      "action": "Maximize Conversions 유지, tCPA 전환 보류",
      "guardrail": "없음",
      "confidence": "high"
    },
    {
      "docId": "google-bidding",
      "section": "google",
      "id": "google-troas-insufficient-conversions",
      "when": "tROAS 전환을 시도하려는 캠페인의 30일 전환수가 15건 미만",
      "metric": "conversions_30d",
      "condition": "< 15",
      "action": "Maximize Conversion Value 유지, tROAS 전환 보류",
      "guardrail": "없음",
      "confidence": "high"
    },
    {
      "docId": "google-bidding",
      "section": "google",
      "id": "google-bidding-learning-period-hold",
      "when": "입찰 전략 변경 후 경과일수가 14일 미만",
      "metric": "days_since_bid_strategy_change",
      "condition": "< 14",
      "action": "성과 판단 보류, 목표값/예산 재조정 금지",
      "guardrail": "명백한 오류(전환 미기록 등)는 즉시 대응 예외",
      "confidence": "high"
    },
    {
      "docId": "google-bidding",
      "section": "google",
      "id": "google-target-adjustment-step-limit",
      "when": "tCPA/tROAS 목표값 1회 조정폭이 10% 초과",
      "metric": "target_change_pct",
      "condition": "> 0.10",
      "action": "조정폭을 10% 이내로 축소해 재실행 권고",
      "guardrail": "시즌성 이벤트 대응 시 예외 허용(별도 문서 참조)",
      "confidence": "medium"
    },
    {
      "docId": "google-scaling",
      "section": "google",
      "id": "google-budget-increase-eligible",
      "when": "캠페인 상태가 '예산으로 제한됨'이고 7일 평균 ROAS/CPA가 목표치 이상",
      "metric": "budget_limited_status, roas_7d",
      "condition": "budget_limited_status == true AND roas_7d >= target_roas",
      "action": "일예산 15~20% 증액",
      "guardrail": "주 1회 한도, 1회 최대 20% 초과 금지",
      "confidence": "high"
    },
    {
      "docId": "google-scaling",
      "section": "google",
      "id": "google-budget-increase-blocked-underperforming",
      "when": "'예산으로 제한됨' 상태이나 목표 ROAS/CPA 미달",
      "metric": "roas_7d",
      "condition": "< target_roas",
      "action": "증액 보류, 입찰/소재 최적화 우선 권고",
      "guardrail": "없음",
      "confidence": "high"
    },
    {
      "docId": "google-scaling",
      "section": "google",
      "id": "google-seasonality-duration-check",
      "when": "시즌성 조정 등록 기간이 14일 초과로 설정 시도",
      "metric": "seasonality_adjustment_duration_days",
      "condition": "> 14",
      "action": "시즌성 조정 대신 캠페인 예산/구조 재설계 권고",
      "guardrail": "없음",
      "confidence": "high"
    },
    {
      "docId": "google-scaling",
      "section": "google",
      "id": "google-single-budget-jump-limit",
      "when": "단일 증액 시도가 직전 대비 20% 초과",
      "metric": "budget_change_pct",
      "condition": "> 0.20",
      "action": "단계적 증액(20% 이내 분할)으로 재실행 권고",
      "guardrail": "확정된 프로모션 기간 총예산 설정은 예외",
      "confidence": "medium"
    },
    {
      "docId": "google-routine",
      "section": "google",
      "id": "google-wasted-search-term-negative",
      "when": "검색어가 90일 지출>0이면서 전환 0건",
      "metric": "conversions_90d, cost_90d",
      "condition": "conversions_90d == 0 AND cost_90d > breakeven_cost_threshold",
      "action": "지출 내림차순 상위 20개 검토 후 의도 카테고리 단위로 부정 키워드 등록",
      "guardrail": "브랜드/핵심 카테고리 키워드는 자동 차단 금지, 수동 확인 필수",
      "confidence": "medium"
    },
    {
      "docId": "google-routine",
      "section": "google",
      "id": "google-search-term-review-overdue",
      "when": "검색어 보고서 마지막 검토일로부터 7일 경과(신규 캠페인은 3~4일)",
      "metric": "days_since_last_search_term_review",
      "condition": "> 7",
      "action": "검토 대기 알림 발생",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "google-routine",
      "section": "google",
      "id": "google-single-lever-change-rule",
      "when": "동일 캠페인에 입찰/소재/키워드/예산 중 2개 이상 항목이 동일 주기 내 동시 변경",
      "metric": "concurrent_lever_changes",
      "condition": "> 1",
      "action": "변경을 분리해 순차 적용하도록 경고, 10~14일 대기 후 다음 변경",
      "guardrail": "긴급 정책 위반 대응, 명백한 오류 수정은 예외",
      "confidence": "medium"
    },
    {
      "docId": "google-routine",
      "section": "google",
      "id": "google-quality-score-low",
      "when": "키워드 품질지수가 5점 이하로 30일 이상 지속",
      "metric": "quality_score",
      "condition": "<= 5",
      "action": "광고 관련성·방문페이지 경험 점검 큐에 등록",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "google-youtube-insights",
      "section": "google",
      "id": "google-pmax-no-touch-learning-45d",
      "when": "PMax 캠페인 생성 또는 주요 설정 변경 후 45일 이내에 예산·입찰 목표 변경 시도",
      "metric": "days_since_pmax_launch_or_major_change",
      "condition": "< 45",
      "action": "변경 보류 경고, 45일 학습기간 완료 후 재평가 권고",
      "guardrail": "명백한 오류(전환 미기록, 정책 반려 등)는 즉시 대응 예외",
      "confidence": "low"
    },
    {
      "docId": "google-youtube-insights",
      "section": "google",
      "id": "google-demandgen-conversion-recheck",
      "when": "Demand Gen 캠페인 전환수가 20일 내 100% 이상 증가",
      "metric": "conversions_change_pct_20d",
      "condition": ">= 1.00",
      "action": "Engaged View Conversion 비중·재귀속(따뜻한 트래픽 흡수) 여부 딥다이브 검증 알림",
      "guardrail": "검증 전 예산 확대 금지",
      "confidence": "low"
    },
    {
      "docId": "google-youtube-insights",
      "section": "google",
      "id": "google-ai-max-negative-prereq",
      "when": "AI Max 활성화 시도 & 계정 레벨 부정 키워드 리스트 미설정",
      "metric": "account_level_negative_keyword_count",
      "condition": "== 0",
      "action": "활성화 보류, 부정 키워드·브랜드 제외 리스트 선행 구축 안내",
      "guardrail": "없음",
      "confidence": "low"
    },
    {
      "docId": "google-ai-search",
      "section": "google",
      "id": "google-aio-nonbrand-informational-budget-review",
      "when": "논브랜드 정보형 키워드 그룹의 오가닉+유료 클릭이 60일 이동평균 대비 30% 이상 하락 & 해당 쿼리에 AI Overviews 노출 확인",
      "metric": "clicks_change_pct_60d",
      "condition": "<= -0.30",
      "action": "예산 축소 검토 알림, 전환 목표를 마이크로 전환(예: 상담신청)으로 재조정 제안",
      "guardrail": "거래형·로컬·브랜드 키워드는 이 규칙 대상에서 제외",
      "confidence": "medium"
    },
    {
      "docId": "google-ai-search",
      "section": "google",
      "id": "google-product-schema-missing-flag",
      "when": "쇼핑 피드 연동 상품 페이지에 Product/Offer 구조화 데이터 미검출",
      "metric": "schema_product_offer_present",
      "condition": "== false",
      "action": "구조화 데이터 추가 작업 티켓 생성 알림",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "google-ai-search",
      "section": "google",
      "id": "google-ai-max-account-level-verify",
      "when": "AI Max 활성화 후 30일 경과 & 계정 레벨 성과 검증 로그 없음",
      "metric": "days_since_ai_max_enabled",
      "condition": ">= 30",
      "action": "계정 레벨 CPA/ROAS 전후 비교 리포트 생성 알림(84% 중립·부정 결과 사례 참고)",
      "guardrail": "없음",
      "confidence": "low"
    },
    {
      "docId": "google-youtube-top100",
      "section": "google",
      "id": "google-aug17-bidding-target-review",
      "when": "예산제한(Limited by budget) 상태의 tCPA/tROAS/Demand Gen tCPC 캠페인이 최근 실적을 목표치보다 유리하게 유지 중",
      "metric": "actual_cpa_vs_target_cpa",
      "condition": "실제CPA < 목표CPA * 0.8 (또는 실제ROAS > 목표ROAS * 1.2)",
      "action": "2026-08-17 스마트비딩 변경 전 타겟을 최근 실적 수준으로 조정하거나 예산 증액 검토 알림",
      "guardrail": "예산 미제약 캠페인은 대상 제외",
      "confidence": "high"
    },
    {
      "docId": "google-youtube-top100",
      "section": "google",
      "id": "google-ai-max-url-expansion-review",
      "when": "AI Max 캠페인에서 Final URL expansion이 켜진 상태로 30일 이상 운영",
      "metric": "ai_max_final_url_expansion_enabled_days",
      "condition": ">= 30",
      "action": "브랜드 안전성/타겟 정밀도 필요 여부 재확인 후 expansion 끄기 + URL 포함 규칙 검토 알림",
      "guardrail": "검색어 리포트에서 무관 트래픽 비중이 낮으면(5% 미만) 유지 허용",
      "confidence": "high"
    },
    {
      "docId": "google-youtube-top100",
      "section": "google",
      "id": "google-pmax-store-goal-single-objective",
      "when": "PMax 매장 목표 캠페인에서 '매장 방문'과 '매출' 목표가 동시 설정 시도됨",
      "metric": "store_goal_objective_count",
      "condition": "> 1",
      "action": "설정 차단, 목표를 하나로 선택하도록 안내",
      "guardrail": "없음",
      "confidence": "high"
    },
    {
      "docId": "google-youtube-top100",
      "section": "google",
      "id": "google-roas-target-staleness-check",
      "when": "ROAS 타겟값이 마지막 변경 이후 180일 이상 그대로 유지",
      "metric": "days_since_last_roas_target_change",
      "condition": ">= 180",
      "action": "블렌디드 ROAS/기여이익 기준으로 타겟 재검토 알림",
      "guardrail": "최근 30일 성과가 목표 대비 -10% 이상 악화 중이면 우선 원인 분석 먼저",
      "confidence": "medium"
    },
    {
      "docId": "lab-template",
      "section": "lab",
      "id": "lab-experiment-missing-field",
      "when": "새 실험 로그 문서에 7개 필드 중 하나 이상 누락",
      "metric": "experiment_log_field_count",
      "condition": "< 7",
      "action": "머지 차단, 누락 필드 목록을 작성자에게 안내",
      "guardrail": "이 템플릿 문서(lab-template) 자체는 예외",
      "confidence": "high"
    },
    {
      "docId": "lab-template",
      "section": "lab",
      "id": "lab-experiment-underpowered-conclusion",
      "when": "실험 기간이 14일 미만인데 결론이 '채택' 또는 '기각'으로 확정",
      "metric": "experiment_duration_days",
      "condition": "< 14",
      "action": "결론을 '보류'로 되돌리고 추가 관측 요청",
      "guardrail": "긴급 소재 사고 대응 등 명시적 예외 사유가 기록된 경우 허용",
      "confidence": "medium"
    },
    {
      "docId": "lab-strategy-backlog",
      "section": "lab",
      "id": "lab-backlog-wave-gate",
      "when": "wave>=2 전략의 dependsOn 목록에 있는 전략 status가 모두 'done'(채택 또는 보류-완료)이 아님",
      "metric": "dependency_status",
      "condition": "!= all_done",
      "action": "해당 전략 status를 'blocked'로 표시하고 실행 큐에서 제외",
      "guardrail": "dependsOn이 빈 배열인 전략은 항상 즉시 실행 가능",
      "confidence": "high"
    },
    {
      "docId": "lab-strategy-backlog",
      "section": "lab",
      "id": "lab-backlog-threshold-met-advance",
      "when": "전략의 durationDays 경과 후 metric이 threshold 충족",
      "metric": "backlog_item_result",
      "condition": ">= threshold",
      "action": "status를 'adopted'로 변경하고 dependsOn에 해당 id를 가진 전략들을 실행 큐에 추가, lab/03-... 실험 로그 자동 초안 생성",
      "guardrail": "결과가 통계적 유의성(최소 14일·95% 신뢰수준) 미달이면 'adopted' 전환 금지, 'inconclusive' 유지",
      "confidence": "medium"
    },
    {
      "docId": "lab-strategy-backlog",
      "section": "lab",
      "id": "lab-backlog-stoprule-trigger",
      "when": "전략 실행 중 stopRule 조건 충족(예: 손익분기 ROAS 미달 지속, 학습기간 경과 후 미개선)",
      "metric": "stop_condition",
      "condition": "== true",
      "action": "status를 'stopped'로 변경, 예산·설정을 실행 전 상태로 롤백, 담당자 알림",
      "guardrail": "정책 위반·클레임 등 긴급 대응 전략은 즉시 중단 예외",
      "confidence": "high"
    },
    {
      "docId": "meta-account-setup",
      "section": "meta",
      "id": "meta-emq-below-threshold",
      "when": "핵심 전환 이벤트(구매/리드)의 EMQ가 6점 미만인 상태가 48시간 이상 지속",
      "metric": "event_match_quality_score",
      "condition": "< 6",
      "action": "이메일/전화번호 등 사용자 파라미터 해싱 필드 점검 알림 발송",
      "guardrail": "이벤트 발행 후 최소 48시간 경과 데이터만 판정에 사용",
      "confidence": "high"
    },
    {
      "docId": "meta-account-setup",
      "section": "meta",
      "id": "meta-capi-dedup-missing",
      "when": "동일 전환에 대해 픽셀과 CAPI 이벤트의 event_id가 불일치하거나 누락",
      "metric": "capi_dedup_match_rate",
      "condition": "< 0.95",
      "action": "이벤트 소스별 event_id 매핑 로직 점검 알림",
      "guardrail": "구현 변경 없이 자동 수정 금지, 알림만 발송",
      "confidence": "high"
    },
    {
      "docId": "meta-account-setup",
      "section": "meta",
      "id": "meta-catalog-feed-error",
      "when": "카탈로그 피드 항목 중 반려/오류 비율이 5% 초과",
      "metric": "catalog_disapproved_item_pct",
      "condition": "> 0.05",
      "action": "피드 오류 상위 사유 리포트 생성 및 담당자 알림",
      "guardrail": "자동 항목 삭제 금지, 리포트만 생성",
      "confidence": "medium"
    },
    {
      "docId": "meta-campaign-structure",
      "section": "meta",
      "id": "meta-adset-fragmentation-warning",
      "when": "동일 캠페인 목표·유사 오디언스로 활성 광고세트가 4개 이상 동시 운영",
      "metric": "active_adset_count_per_objective",
      "condition": ">= 4",
      "action": "광고세트 통합 검토 알림 발송 (자동 병합 금지)",
      "guardrail": "실제 병합은 담당자 승인 후 수동 실행",
      "confidence": "medium"
    },
    {
      "docId": "meta-campaign-structure",
      "section": "meta",
      "id": "meta-adset-learning-limited-7d",
      "when": "광고세트가 7일 연속 '학습 제한' 상태(주간 전환 50회 미달)",
      "metric": "learning_limited_days",
      "condition": ">= 7",
      "action": "타겟 확장 또는 상위 캠페인(ASC+/CBO)으로 통합 제안",
      "guardrail": "예산 증액과 동시에 실행하지 않음(변수 분리)",
      "confidence": "high"
    },
    {
      "docId": "meta-campaign-structure",
      "section": "meta",
      "id": "meta-low-creative-diversity",
      "when": "광고세트당 활성 크리에이티브 수가 6개 미만",
      "metric": "active_creatives_per_adset",
      "condition": "< 6",
      "action": "신규 크리에이티브 추가 요청 알림",
      "guardrail": "일 1회 알림, 24시간 내 중복 알림 금지",
      "confidence": "medium"
    },
    {
      "docId": "meta-creative",
      "section": "meta",
      "id": "meta-non-vertical-creative-flag",
      "when": "신규 업로드 소재의 종횡비가 9:16/4:5/1:1이 아닌 가로형으로 감지",
      "metric": "creative_aspect_ratio",
      "condition": "not in [9:16, 4:5, 1:1]",
      "action": "세로형 재제작 권고 알림",
      "guardrail": "게재 차단은 하지 않고 알림만 발송",
      "confidence": "medium"
    },
    {
      "docId": "meta-creative",
      "section": "meta",
      "id": "meta-creative-volume-below-budget-tier",
      "when": "월 소재 투입 수가 해당 예산 구간 권장치(5K당 4~5개, 100K당 40~50개) 대비 50% 미만",
      "metric": "monthly_new_creative_count_ratio",
      "condition": "< 0.5",
      "action": "크리에이티브 제작 파이프라인 점검 알림",
      "guardrail": "월 1회 판정, 월 중간 알림 금지",
      "confidence": "medium"
    },
    {
      "docId": "meta-creative-testing",
      "section": "meta",
      "id": "meta-creative-test-insufficient-data",
      "when": "테스트 변형의 전환수가 50회 미만이고 경과일이 7일 미만",
      "metric": "conversions_per_variant",
      "condition": "< 50 AND days_running < 7",
      "action": "판정 보류, 데이터 수집 계속 알림",
      "guardrail": "이 상태에서는 예산/타겟 변경 금지",
      "confidence": "high"
    },
    {
      "docId": "meta-creative-testing",
      "section": "meta",
      "id": "meta-winner-scale-standard",
      "when": "승자 소재가 목표 지표(ROAS/CPA) 기준 달성 상태로 3일 이상 안정",
      "metric": "days_meeting_target",
      "condition": ">= 3",
      "action": "스케일 캠페인 예산 20% 증액 (3~4일 간격)",
      "guardrail": "단일 증액 20% 상한, 증액 후 최소 48시간 관망",
      "confidence": "high"
    },
    {
      "docId": "meta-creative-testing",
      "section": "meta",
      "id": "meta-winner-scale-aggressive",
      "when": "일 전환 300회 이상 & CPA가 목표 대비 30% 이상 낮음",
      "metric": "daily_conversions",
      "condition": ">= 300 AND cpa_vs_target <= -0.30",
      "action": "예산 40~50% 증액 허용",
      "guardrail": "3일 연속 조건 충족 시에만 적용, 연속 적용은 주 2회 상한",
      "confidence": "medium"
    },
    {
      "docId": "meta-creative-testing",
      "section": "meta",
      "id": "meta-creative-lifespan-warning",
      "when": "소재 노출 경과일이 21일 이상이며 CTR이 7일 전 대비 10% 이상 하락",
      "metric": "creative_age_days",
      "condition": ">= 21",
      "action": "교체 후보 소재 테스트 투입 알림",
      "guardrail": "즉시 소재 중단 금지, 대체 소재 검증 후 순차 교체",
      "confidence": "medium"
    },
    {
      "docId": "meta-targeting",
      "section": "meta",
      "id": "meta-legacy-detailed-targeting-stack",
      "when": "광고세트에 관심사 상세타겟팅이 3개 이상 AND 옵션이 상세타겟팅 확장(제안) OFF",
      "metric": "detailed_targeting_count",
      "condition": ">= 3 AND detailed_targeting_expansion == false",
      "action": "과거 방식 세팅 감지, 어드밴티지+ 오디언스 전환 검토 알림",
      "guardrail": "자동 변경 금지, 담당자 확인 후 수동 전환",
      "confidence": "high"
    },
    {
      "docId": "meta-targeting",
      "section": "meta",
      "id": "meta-prospecting-missing-exclusion",
      "when": "콜드 프로스펙팅 목적 광고세트에 커스텀 오디언스 제외가 설정되지 않음",
      "metric": "exclusion_audience_count",
      "condition": "== 0",
      "action": "구매자/방문자 제외 오디언스 추가 권고 알림",
      "guardrail": "재구매 유도가 목적인 캠페인(구매자 타겟)은 이 룰에서 제외",
      "confidence": "medium"
    },
    {
      "docId": "meta-scaling",
      "section": "meta",
      "id": "meta-budget-change-over-20pct",
      "when": "24시간 내 예산 변경폭이 직전 대비 20% 초과",
      "metric": "budget_change_pct_24h",
      "condition": "> 0.20",
      "action": "학습 리셋 위험 경고, 변경 승인 재확인 요청",
      "guardrail": "긴급 예산 중단(성과 급락) 상황은 이 룰에서 예외 처리",
      "confidence": "high"
    },
    {
      "docId": "meta-scaling",
      "section": "meta",
      "id": "meta-scale-standard-increment",
      "when": "광고세트/캠페인이 목표 지표를 3일 연속 충족하고 마지막 증액 후 3일 이상 경과",
      "metric": "days_since_last_budget_change",
      "condition": ">= 3",
      "action": "예산 20% 증액 실행 제안",
      "guardrail": "1회 실행 후 재실행까지 최소 3일 대기",
      "confidence": "medium"
    },
    {
      "docId": "meta-scaling",
      "section": "meta",
      "id": "meta-scale-aggressive-increment",
      "when": "일 전환 300회 이상 AND CPA가 목표 대비 30% 이상 낮음",
      "metric": "daily_conversions",
      "condition": ">= 300 AND cpa_vs_target <= -0.30",
      "action": "예산 40~50% 증액 허용",
      "guardrail": "주 2회 상한, 증액 후 48시간 관망 의무",
      "confidence": "medium"
    },
    {
      "docId": "meta-scaling",
      "section": "meta",
      "id": "meta-premature-kill-adset",
      "when": "광고세트 집행 후 3일 미만 & 학습 단계 중 예산/타겟 중대 수정 시도",
      "metric": "adset_age_days",
      "condition": "< 3",
      "action": "조기 판단 경고, 최소 3~5일 관망 권고 알림",
      "guardrail": "명백한 정책 위반·과지출 등 긴급 사유는 예외",
      "confidence": "medium"
    },
    {
      "docId": "meta-routine",
      "section": "meta",
      "id": "meta-frequency-cold-warning",
      "when": "콜드(프로스펙팅) 캠페인 빈도가 2.5 초과",
      "metric": "frequency_cold",
      "condition": "> 2.5",
      "action": "소재 피로 경고, 신규 크리에이티브 투입 알림",
      "guardrail": "동일 알림 24시간 내 중복 발송 금지",
      "confidence": "medium"
    },
    {
      "docId": "meta-routine",
      "section": "meta",
      "id": "meta-frequency-retargeting-warning",
      "when": "리타겟팅 캠페인 빈도가 4.0 초과",
      "metric": "frequency_retargeting",
      "condition": "> 4.0",
      "action": "오디언스 확장 또는 소재 교체 알림",
      "guardrail": "재구매 유도 목적 캠페인은 임계값 상향 조정 가능",
      "confidence": "medium"
    },
    {
      "docId": "meta-routine",
      "section": "meta",
      "id": "meta-ctr-drop-early-warning",
      "when": "CTR이 7일 전 대비 10% 이상 하락",
      "metric": "ctr_7d_change_pct",
      "condition": "<= -0.10",
      "action": "조기 경보 알림, 크리에이티브 점검 요청",
      "guardrail": "최소 지출 기준(목표 CPA 2배) 미달 시 판정 보류",
      "confidence": "medium"
    },
    {
      "docId": "meta-routine",
      "section": "meta",
      "id": "meta-cpa-pause-rule",
      "when": "CPA가 목표 대비 150% 초과 상태로 3일 연속 지속",
      "metric": "cpa_vs_target_pct",
      "condition": ">= 1.50 for 3 consecutive days",
      "action": "해당 광고세트/광고 일시중지",
      "guardrail": "최소 지출(목표 CPA의 2~3배) 미충족 시 적용 제외, 일시중지는 재개 검토 전제",
      "confidence": "high"
    },
    {
      "docId": "meta-routine",
      "section": "meta",
      "id": "meta-daily-budget-flapping",
      "when": "7일 내 예산 변경 횟수가 3회 초과",
      "metric": "budget_change_count_7d",
      "condition": "> 3",
      "action": "예산 변경 빈도 과다 경고, 변경 주기 규칙(3~4일 간격) 안내",
      "guardrail": "성과 급락 대응 등 긴급 변경은 카운트에서 제외 가능",
      "confidence": "medium"
    },
    {
      "docId": "meta-youtube-insights",
      "section": "meta",
      "id": "meta-hard-deck-spend-floor",
      "when": "일 예산을 최저 방어선(하드덱) 미만으로 낮추려는 시도 발생 & 저성과 지속일수 3일 미만",
      "metric": "days_underperforming, proposed_daily_budget",
      "condition": "days_underperforming < 3 AND proposed_daily_budget < hard_deck_floor",
      "action": "감액 보류, 3일 연속 저성과 확인 후 재검토 알림",
      "guardrail": "하드덱 값 자체는 계정별 수동 설정, 명백한 과지출·정책위반은 예외",
      "confidence": "low"
    },
    {
      "docId": "meta-youtube-top100",
      "section": "meta",
      "id": "meta-avoid-cost-per-result-goal-default",
      "when": "신규 캠페인 입찰 전략을 Cost-Per-Result Goal(코스트캡)로 기본 설정하려는 시도 발생",
      "metric": "bid_strategy",
      "condition": "bid_strategy == 'cost_per_result_goal' AND account_has_min_roas_option == true",
      "action": "Min ROAS 입찰과 2주 A/B 테스트 후 결정, 코스트캡 단독 채택 보류",
      "guardrail": "학습단계(50 전환/주 미만) 계정은 예외, 전환량 부족 시 코스트캡 유지 허용",
      "confidence": "medium"
    },
    {
      "docId": "naver-account-structure",
      "section": "naver",
      "id": "naver-group-keyword-limit-warning",
      "when": "광고그룹 내 등록 키워드 수가 500개를 초과",
      "metric": "group_keyword_count",
      "condition": "> 500",
      "action": "그룹 분할(속성 기준 재분리) 검토 알림 발송",
      "guardrail": "실제 분할은 수동 승인 후 실행, 자동 이동 금지(키워드는 그룹 간 이동 불가하므로 신규 생성 필요)",
      "confidence": "medium"
    },
    {
      "docId": "naver-account-structure",
      "section": "naver",
      "id": "naver-mixed-brand-nonbrand-detect",
      "when": "동일 광고그룹 내 브랜드 키워드와 일반/경쟁사 키워드가 혼재",
      "metric": "group_keyword_type_diversity",
      "condition": ">= 2 categories in one group",
      "action": "그룹 분리 권고 리포트 생성",
      "guardrail": "키워드명 기반 브랜드 매칭은 오탐 가능 — 광고주 브랜드 사전(brand_dictionary) 대조 필수",
      "confidence": "medium"
    },
    {
      "docId": "naver-account-structure",
      "section": "naver",
      "id": "naver-device-cross-serve-check",
      "when": "PC 전용 그룹의 노출 매체 목록에 모바일 통합검색이 포함",
      "metric": "group_media_setting_mismatch",
      "condition": "device_type != media_targets",
      "action": "매체 설정 수정 알림, 자동 미수정",
      "guardrail": "매체 설정 변경은 광고주 승인 후에만 반영",
      "confidence": "high"
    },
    {
      "docId": "naver-account-structure",
      "section": "naver",
      "id": "naver-new-group-quality-caution",
      "when": "광고그룹 생성 후 24시간 이내",
      "metric": "group_age_hours",
      "condition": "< 24",
      "action": "신규 소재 품질지수 4단계(중간) 가정, 입찰가 상한 보수적 적용 플래그",
      "guardrail": "24시간 경과 후 자동 해제, 수동 재확인 권장",
      "confidence": "medium"
    },
    {
      "docId": "naver-keywords",
      "section": "naver",
      "id": "naver-longtail-ratio-low-warning",
      "when": "그룹 내 대표키워드(월검색량 상위 20%) 대비 세부키워드 등록 비율이 낮음",
      "metric": "longtail_keyword_ratio",
      "condition": "< 0.5",
      "action": "연관키워드 도구로 세부키워드 후보 20개 이상 추출해 확장 제안",
      "guardrail": "제안만 생성, 자동 등록 금지(사람 승인 필요)",
      "confidence": "medium"
    },
    {
      "docId": "naver-keywords",
      "section": "naver",
      "id": "naver-zero-conversion-search-term-exclude",
      "when": "검색어보고서 기준 특정 검색어의 클릭 20회 이상, 전환 0건이 최근 30일 지속",
      "metric": "search_term_conversions_30d",
      "condition": "clicks >= 20 AND conversions == 0",
      "action": "제외 검색어 등록 후보로 플래그",
      "guardrail": "브랜드/핵심 대표키워드는 자동 제외 후보에서 배제, 최종 등록은 수동 확인",
      "confidence": "medium"
    },
    {
      "docId": "naver-keywords",
      "section": "naver",
      "id": "naver-seasonal-keyword-lead-time",
      "when": "데이터랩 기준 특정 카테고리 검색량이 전년 동기 대비 상승 추세 진입",
      "metric": "datalab_trend_slope",
      "condition": "positive trend detected 60~90 days before peak",
      "action": "시즌 키워드 후보 리스트 생성 및 담당자 알림",
      "guardrail": "추세 판단은 최소 4주 이상 데이터로 확정",
      "confidence": "low"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-bid-above-breakeven-cpc",
      "when": "키워드의 실제 평균 CPC가 손익분기 CPC(CVR×AOV×마진율)를 7일 연속 초과",
      "metric": "avg_cpc_7d",
      "condition": "> breakeven_cpc",
      "action": "입찰가 15~20% 인하",
      "guardrail": "일 1회 조정 한도, 최저 입찰가 70원 미만 금지, 신규 소재(24시간 미만)는 제외",
      "confidence": "medium"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-bid-down-low-roas",
      "when": "키워드 ROAS가 손익분기 ROAS 미만으로 7일 연속",
      "metric": "roas_7d",
      "condition": "< breakeven_roas",
      "action": "입찰가 20% 인하",
      "guardrail": "일 1회, 최저 입찰가 70원 미만 금지",
      "confidence": "high"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-bid-up-safe-margin",
      "when": "키워드 ROAS가 목표 ROAS(손익분기+200%p)를 14일 연속 초과하고 노출순위가 5위 밖",
      "metric": "roas_14d",
      "condition": "> target_roas AND rank > 5",
      "action": "입찰가 10% 인상 후 순위 변화 모니터링",
      "guardrail": "1회 인상 후 최소 3일 관찰 없이 재인상 금지",
      "confidence": "medium"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-new-material-quality-grace",
      "deprecated": true,
      "deprecated_since": "2026-07-29",
      "deprecated_reason": "파워링크 품질지수(nccQi)가 시스템 고정값 4로 대체되어 '24시간 미확정→재산정' 개념 자체가 무의미해짐. 네이버 검색광고 API 공식 공지(파워링크 QI 항목 종료 안내, 2026-06-30 공지·2026-07-29 시행) 기준.",
      "superseded_by": "naver-powerlink-qi-field-deprecated",
      "when": "[구방식, 파워링크 무효] 소재 게재 후 24시간 미만",
      "metric": "material_age_hours",
      "condition": "< 24",
      "action": "[구방식] 품질지수 4단계(중간)로 간주, 자동 입찰가 조정 규칙 적용 보류",
      "guardrail": "24시간 경과 시 자동 해제 — 단, 본 규칙 자체를 신규 로직에 사용 금지",
      "confidence": "high"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-powerlink-qi-field-deprecated",
      "when": "파워링크 키워드/소재 자동화 로직이 nccQi 또는 품질지수 막대 값을 조회·참조하려고 시도",
      "metric": "nccqi_field_usage",
      "condition": "reference_date >= 2026-07-29",
      "action": "nccQi 기반 판단 로직을 비활성화하고 참조를 차단, ROAS·CPC·CVR·CTR 등 성과 지표 기반 규칙(naver-bid-* 계열)으로만 입찰 판단",
      "guardrail": "자동 전환 전 사람 검토, 03번 문서와 07번(유튜브 인사이트) 문서 갱신 동기화 필수",
      "confidence": "high"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-ad-relevance-click-expectation-monitor",
      "when": "파워링크 광고관리시스템에서 광고 연관지수·클릭 기대지수 값이 표시됨(2026-07-29~ 현재 체계)",
      "metric": "ad_relevance_index, click_expectation_index",
      "condition": "값 존재 시 매일 1회 스냅샷 기록",
      "action": "추이만 대시보드에 기록. 산정 로직·개선법이 공식 미공개 상태이므로 이 값을 근거로 한 자동 입찰가 조정 규칙은 아직 만들지 않는다",
      "guardrail": "자동 입찰 조정에 절대 사용 금지 — 공식 문서로 산정 로직이 확인된 뒤에만 별도 규칙화(공식 확인 필요)",
      "confidence": "low"
    },
    {
      "docId": "naver-bidding",
      "section": "naver",
      "id": "naver-budget-burn-midday-alert",
      "when": "오전 12시 이전 일예산 소진률이 50% 이상",
      "metric": "budget_burn_rate_by_noon",
      "condition": ">= 0.5",
      "action": "입찰가·소재 추가 점검 알림 발송",
      "guardrail": "알림만 발송, 자동 예산 증액 금지",
      "confidence": "low"
    },
    {
      "docId": "naver-ads-creative",
      "section": "naver",
      "id": "naver-creative-min-count-check",
      "when": "광고그룹 내 등록 소재 수가 1개",
      "metric": "group_creative_count",
      "condition": "== 1",
      "action": "성과기반 노출 활성화를 위해 소재 추가 등록 알림",
      "guardrail": "자동 생성 문구는 반려 위험 표현(최상급·의학적 효능) 필터링 후에만 등록 제안",
      "confidence": "low"
    },
    {
      "docId": "naver-ads-creative",
      "section": "naver",
      "id": "naver-creative-banned-phrase-filter",
      "when": "소재 문구 초안에 반려 위험 표현(1위/최고/압도적/통증 완화/후회 등) 포함",
      "metric": "creative_text_risk_flag",
      "condition": "contains banned_phrase_list",
      "action": "등록 전 차단 및 완곡 표현으로 수정 제안",
      "guardrail": "금칙어 사전은 정기적으로 검수 반려 사례 반영해 갱신",
      "confidence": "medium"
    },
    {
      "docId": "naver-ads-creative",
      "section": "naver",
      "id": "naver-extension-coverage-gap",
      "when": "업종상 사용 가능한 확장소재(가격링크/전화번호/서브링크 등) 중 미등록 항목 존재",
      "metric": "extension_coverage_ratio",
      "condition": "< 0.7",
      "action": "미등록 확장소재 목록 생성 및 등록 권고",
      "guardrail": "업종별 적용 가능 확장소재만 제안(예: 이미지형 서브링크는 식당/여행 등 한정 업종)",
      "confidence": "medium"
    },
    {
      "docId": "naver-shopping",
      "section": "naver",
      "id": "naver-shopping-soldout-auto-pause",
      "when": "스마트스토어 상품이 품절 또는 삭제 상태로 전환",
      "metric": "product_stock_status",
      "condition": "== soldout OR == deleted",
      "action": "해당 상품 쇼핑검색광고 자동 노출 중단 확인(EP 반영 지연 시 수동 확인 알림)",
      "guardrail": "EP 반영 주기(최대 1시간, 네이버쇼핑 반영 최대 6시간)를 감안해 즉시 조치 실패 시 알림만 발송",
      "confidence": "medium"
    },
    {
      "docId": "naver-shopping",
      "section": "naver",
      "id": "naver-shopping-negative-search-term-review",
      "when": "상품 소재의 검색어 리포트에서 특정 검색어 클릭 20회 이상, 전환 0건이 14일 지속",
      "metric": "shopping_search_term_conversions_14d",
      "condition": "clicks >= 20 AND conversions == 0",
      "action": "제외 검색어 등록 후보로 플래그",
      "guardrail": "핵심 카테고리 검색어는 자동 제외 후보에서 배제",
      "confidence": "medium"
    },
    {
      "docId": "naver-shopping",
      "section": "naver",
      "id": "naver-shopping-title-seo-gap-check",
      "when": "상품명에 카테고리 대표키워드가 미포함되거나 속성/태그 미등록",
      "metric": "product_title_seo_completeness",
      "condition": "< required_fields",
      "action": "상품명·속성·태그 보완 제안 리스트 생성",
      "guardrail": "과도한 키워드 나열(어뷰징성 상품명)은 제안에서 제외",
      "confidence": "low"
    },
    {
      "docId": "naver-routine",
      "section": "naver",
      "id": "naver-daily-budget-burn-check",
      "when": "매일 정오 기준 일예산 소진률 확인",
      "metric": "budget_burn_rate_noon",
      "condition": ">= 0.5",
      "action": "오후 소진 속도 예측 후 입찰가/예산 조정 알림",
      "guardrail": "자동 예산 증액 금지, 알림만 발송",
      "confidence": "low"
    },
    {
      "docId": "naver-routine",
      "section": "naver",
      "id": "naver-weekly-zero-conversion-term-sweep",
      "when": "매주 1회 검색어보고서 배치 분석",
      "metric": "search_term_conversions_7d",
      "condition": "clicks >= 15 AND conversions == 0",
      "action": "제외 검색어 후보 리스트 생성",
      "guardrail": "브랜드/대표키워드 자동 제외 후보에서 배제, 최종 등록은 수동 승인",
      "confidence": "medium"
    },
    {
      "docId": "naver-routine",
      "section": "naver",
      "id": "naver-weekly-underperform-keyword-flag",
      "when": "매주 1회, 키워드 CTR이 계정 평균의 50% 미만이고 클릭 30회 이상",
      "metric": "keyword_ctr_vs_account_avg",
      "condition": "< 0.5 * account_avg_ctr AND clicks >= 30",
      "action": "소재 교체 또는 입찰가 재검토 후보로 플래그",
      "guardrail": "신규 소재(24시간 미만)는 판단 대상에서 제외",
      "confidence": "medium"
    },
    {
      "docId": "naver-routine",
      "section": "naver",
      "id": "naver-monthly-budget-reallocation",
      "when": "매월 1회, 캠페인/그룹 ROAS가 계정 평균 대비 현저한 격차",
      "metric": "campaign_roas_vs_account_avg_monthly",
      "condition": "top quartile vs bottom quartile gap > 2x",
      "action": "저성과 그룹 예산 일부를 고성과 그룹으로 재배분 제안",
      "guardrail": "재배분 폭은 1회 최대 20%로 제한, 수동 승인 필요",
      "confidence": "low"
    },
    {
      "docId": "naver-routine",
      "section": "naver",
      "id": "naver-creative-refresh-cycle",
      "when": "동일 소재 문구가 90일 이상 무변경 게재",
      "metric": "creative_unchanged_days",
      "condition": ">= 90",
      "action": "소재 리프레시(문구 교체) 검토 알림",
      "guardrail": "CTR이 계정 평균 이상인 소재는 알림에서 제외 가능",
      "confidence": "low"
    },
    {
      "docId": "naver-youtube-insights",
      "section": "naver",
      "id": "naver-display-campaign-cap-alert",
      "when": "계정 내 디스플레이(GFA) 캠페인 총 개수가 신규 상한에 근접",
      "metric": "display_campaign_count",
      "condition": ">= 900",
      "action": "캠페인 통폐합 검토 알림 발송 (상한 1,000개, 2026-03-30 통합 플랫폼 기준)",
      "guardrail": "자동 삭제·병합 금지, 알림만 발송",
      "confidence": "medium"
    },
    {
      "docId": "naver-youtube-insights",
      "section": "naver",
      "id": "naver-powerlink-qi-deprecated",
      "when": "파워링크 키워드/소재 최적화 로직이 nccQi(품질지수) 값을 참조",
      "metric": "nccqi_field_usage",
      "condition": "reference_date >= 2026-07-29",
      "action": "nccQi 기반 판단 로직 비활성화, CTR·CVR·전환매출 등 대체 지표로 전환",
      "guardrail": "자동 전환 전 검토 필요, 03번 문서 갱신과 동기화",
      "confidence": "high"
    },
    {
      "docId": "naver-youtube-insights",
      "section": "naver",
      "id": "naver-shorts-keyword-candidate",
      "when": "쇼츠·숏폼 유입 검색어 중 최근 2주 검색량이 이전 대비 급증",
      "metric": "shorts_referral_keyword_growth_2w",
      "condition": "growth_rate >= 2x",
      "action": "파워링크 키워드/확장소재 후보로 등록 제안",
      "guardrail": "자동 키워드 등록 금지, 사람 검토 후 반영",
      "confidence": "low"
    },
    {
      "docId": "naver-ai-search",
      "section": "naver",
      "id": "naver-ai-briefing-exposure-monitor",
      "when": "주요 브랜드/핵심 키워드 목록에 대해 AI 브리핑 노출 여부를 정기 크롤링",
      "metric": "ai_briefing_exposure_flag",
      "condition": "노출 여부가 이전 체크 대비 변경(신규 노출 or 노출 중단)",
      "action": "담당자에게 알림, 해당 키워드의 광고 CTR·전환 추이를 별도 추적 태그로 표시",
      "guardrail": "자동 입찰 조정 금지, 알림만 발송 — 확정 인과관계 데이터 없음",
      "confidence": "low"
    },
    {
      "docId": "naver-ai-search",
      "section": "naver",
      "id": "naver-ai-briefing-ctr-drop-flag",
      "when": "AI 브리핑이 노출되는 키워드의 검색광고 CTR이 노출 이전 4주 평균 대비 하락",
      "metric": "ctr_4w_change_on_ai_briefing_keywords",
      "condition": "<= -15%",
      "action": "쇼핑검색광고·애드부스트 비중 재검토 알림, 03번 품질지수 점검 항목에 편입",
      "guardrail": "자동 예산 재배분 금지, 사람 검토 후 반영. 표본 부족 시(주간 클릭 30회 미만) 규칙 적용 보류",
      "confidence": "low"
    },
    {
      "docId": "naver-ai-search",
      "section": "naver",
      "id": "naver-smartstore-attribute-completeness",
      "when": "스마트스토어 상품 등록/수정 시 네이버쇼핑 필터 대상 속성값 누락 여부 점검",
      "metric": "product_attribute_completeness_pct",
      "condition": "< 90%",
      "action": "속성값 보완 필요 상품 리스트 생성 및 담당자 알림",
      "guardrail": "자동 수정 금지, 사람 검토 후 반영",
      "confidence": "low"
    },
    {
      "docId": "naver-plus-store",
      "section": "naver",
      "id": "naver-plus-store-roas-window-extend",
      "when": "네플스/개인화 채널 비중이 높은 캠페인의 ROAS를 표준 7일 판정 주기로 평가하려는 경우",
      "metric": "roas_evaluation_window_days",
      "condition": "== 7 AND target_channel == naver_plus_store_personalized",
      "action": "판정 주기를 21~28일로 임시 연장 제안(재구매·재노출형 채널 특성 반영)",
      "guardrail": "자동 연장 금지 — 담당자 확인 후 수동 승인. 정량적 '개인화 재노출 지연기간' 공식 근거 없음(low), 연장폭은 자체 계정 데이터로 보정 필수",
      "confidence": "low"
    },
    {
      "docId": "naver-plus-store",
      "section": "naver",
      "id": "naver-plus-store-new-target-click-campaign-kpi",
      "when": "신규 타깃 발굴 목적의 블로그·지식인·파워링크·GFA 캠페인을 기존 즉시전환 ROAS 기준으로 조기 종료하려는 경우",
      "metric": "immediate_roas_7d",
      "condition": "< breakeven_roas AND campaign_purpose == new_target_discovery",
      "action": "즉시 예산 삭감 대신 '관심데이터 축적 KPI'(찜·재방문·재검색 발생률)로 별도 트래킹 태그 부여 후 재평가 알림",
      "guardrail": "이 규칙 자체가 검증되지 않은 가설(파워링크 클릭→개인화 재노출 연동, low confidence)에 기반하므로, 자동 예산 재배분·자동 연장 금지. 사람이 관심데이터 축적 효과를 자체 데이터로 확인한 뒤에만 캠페인 유지 결정",
      "confidence": "low"
    },
    {
      "docId": "naver-plus-store",
      "section": "naver",
      "id": "naver-plus-store-exposure-risk-monitor",
      "when": "최근 30일 벌점 합계 또는 어뷰징 적발 건수가 네플스 비노출 임계치에 근접",
      "metric": "penalty_points_30d, abuse_flags_weekly",
      "condition": "penalty_points_30d >= 10 AND penalty_ratio >= 40% OR abuse_flags_weekly >= 2",
      "action": "담당자에게 네플스 노출 중단 위험 알림, 원인(배송지연/응대/어뷰징) 태그별로 분류",
      "guardrail": "자동 조치 없음 — 사람이 셀러센터에서 직접 소명·개선 처리. 정책 세부 기준은 네이버 공지 변경 가능성 있으므로 분기 1회 원문 재확인",
      "confidence": "medium"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-ads-not-showing-url-recollect",
      "when": "세팅 변경 없이 광고 노출/소진이 갑자기 0에 가깝게 떨어짐",
      "metric": "impressions_drop_pct_1d",
      "condition": ">= 80% (전일 대비)",
      "action": "사이트 색인·연결URL 재수집 상태 점검 알림 발송",
      "guardrail": "자동 예산 조정·중단 금지, 알림만 발송(원인 미확정 상태이므로 사람 확인 필수)",
      "confidence": "medium"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-adboost-overlap-check",
      "when": "동일 상품군에서 ADboost(쇼핑)와 쇼핑검색광고를 동시 운영",
      "metric": "adboost_and_search_ads_active",
      "condition": "both == true",
      "action": "노출 인벤토리 중복 여부 리포트 점검 알림 발송",
      "guardrail": "자동 예산 조정·중단 금지, 알림만 발송",
      "confidence": "medium"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-adboost-condition-required",
      "when": "애드부스트(쇼핑검색/GFA) 신규 활성화 시 노출 조건·제외키워드가 미설정",
      "metric": "adboost_condition_set",
      "condition": "== false",
      "action": "조건 미설정 상태로 켜져 있음을 담당자에게 경고, 조건 설계 전 임시 예산 상한 제안",
      "guardrail": "자동 조건 설정·자동 off 금지, 경고 알림만 발송",
      "confidence": "low"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-place-precheck-before-ad",
      "when": "신규 플레이스 광고 캠페인 시작 예정",
      "metric": "place_basic_info_complete",
      "condition": "사진/기본정보/리뷰/소개글 중 1개 이상 미충족",
      "action": "광고 집행 전 기초 콘텐츠(사진·정보·리뷰·소개글) 보완 체크리스트 알림",
      "guardrail": "자동 광고 집행 차단 금지, 체크리스트 알림만 발송",
      "confidence": "low"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-ai-content-policy-flag",
      "when": "상세페이지·블로그·광고소재 제작에 AI 생성 콘텐츠 사용",
      "metric": "ai_generated_content_used",
      "condition": "== true",
      "action": "2026-07-10 시행 네이버 AI 생성물 표시 정책 준수 여부(미노출·클린프로그램 리스크) 및 블로그 SEO 노출 제한 가능성 확인 알림",
      "guardrail": "자동 게시 차단 금지, 검수 담당자 알림만 발송",
      "confidence": "medium"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-gfa-large-budget-patience",
      "when": "GFA 일 예산이 급격히 확대(예: 전주 대비 3배 이상)된 직후 ROAS가 목표 대비 하락",
      "metric": "roas_vs_target",
      "condition": "< target_roas AND days_since_budget_increase < 7",
      "action": "즉시 off/축소 대신 최소 7일 관찰 후 재판단하도록 담당자에게 안내",
      "guardrail": "자동 off 금지, 관찰 권고 알림만 발송 — 실제 손실이 임계치를 넘으면 사람이 직접 판단",
      "confidence": "low"
    },
    {
      "docId": "naver-youtube-top100",
      "section": "naver",
      "id": "naver-revenue-spike-risk-check",
      "when": "스토어 매출이 전월 대비 급등",
      "metric": "revenue_growth_mom",
      "condition": ">= 2x",
      "action": "재고·CS·계정정책 준수 상태 점검 알림 발송",
      "guardrail": "자동 광고 예산 증액 금지, 사람 검토 후 집행",
      "confidence": "low"
    },
    {
      "docId": "overview-how-to-use",
      "section": "overview",
      "id": "overview-doc-missing-hook",
      "when": "새 문서가 추가되는데 '## 자동화 훅' json 블록이 없음",
      "metric": "doc_has_automation_hook",
      "condition": "== false",
      "action": "머지 차단, 작성자에게 CONTENT_GUIDE 5단 구조 안내",
      "guardrail": "overview 섹션의 메타 안내 문서는 수동 검토 후 예외 허용",
      "confidence": "high"
    },
    {
      "docId": "sources-list",
      "section": "sources",
      "id": "sources-broken-link-check",
      "when": "소스 URL이 정기 헬스체크에서 404 또는 접근불가 응답",
      "metric": "source_url_status_code",
      "condition": ">= 400",
      "action": "해당 소스 행에 '점검필요' 태그, 수집 파이프라인에서 일시 제외",
      "guardrail": "로그인 필요로 표기된 소스(Coupang Ads 공지 등)는 401/403을 정상으로 간주",
      "confidence": "medium"
    },
    {
      "docId": "sources-pipeline",
      "section": "sources",
      "id": "sources-pipeline-no-auto-merge",
      "when": "AI 요약 초안이 생성되었는데 사람 검토(승인) 없이 병합 시도",
      "metric": "human_review_approved",
      "condition": "== false",
      "action": "병합 차단, 검토 대기열로 이동",
      "guardrail": "예외 없음 — 이 규칙은 항상 강제",
      "confidence": "high"
    },
    {
      "docId": "sources-pipeline",
      "section": "sources",
      "id": "sources-pipeline-no-transcript-scrape",
      "when": "파이프라인이 소유하지 않은 유튜브 채널의 자막(캡션) 텍스트를 대량 수집하려는 요청",
      "metric": "transcript_scrape_requested",
      "condition": "== true",
      "action": "수집 거부, 메타데이터(제목·설명)만 수집하도록 강제",
      "guardrail": "본인 소유 채널 또는 명시적 OAuth 권한이 있는 경우만 공식 캡션 API 사용 허용",
      "confidence": "high"
    },
    {
      "docId": "strategy-funnel-kpi",
      "section": "strategy",
      "id": "strategy-below-breakeven-roas",
      "when": "캠페인 ROAS가 손익분기 ROAS 미만으로 7일 연속",
      "metric": "roas_7d",
      "condition": "< breakeven_roas",
      "action": "입찰가 하향 또는 예산 축소 검토 알림 발송",
      "guardrail": "인지 목적(브랜드 캠페인) 태그가 붙은 캠페인은 제외, 최소 7일 데이터 확보 후 판단",
      "confidence": "high"
    },
    {
      "docId": "strategy-budget-mix",
      "section": "strategy",
      "id": "strategy-reallocate-underperform",
      "when": "검증 채널(70% 그룹) 캠페인이 최소 관측기간 14일 동안 손익분기 ROAS 미달",
      "metric": "roas_14d",
      "condition": "< breakeven_roas",
      "action": "해당 캠페인 예산 20% 축소, 성장 채널(20% 그룹)로 재배분 제안",
      "guardrail": "1회 재배분은 총 예산의 20% 초과 금지, 인지 목적 캠페인 제외",
      "confidence": "medium"
    },
    {
      "docId": "strategy-testing",
      "section": "strategy",
      "id": "strategy-test-early-stop-block",
      "when": "A/B 테스트 시작 후 14일 미만 또는 최소 표본 미달인데 결과 채택 요청 발생",
      "metric": "test_days_elapsed_or_sample_size",
      "condition": "< min_duration_14d OR < min_sample",
      "action": "결과 채택 차단, 추가 데이터 수집 안내",
      "guardrail": "긴급 소재 사고(어뷰징·클레임) 대응은 예외로 즉시 중단 허용",
      "confidence": "medium"
    },
    {
      "docId": "strategy-creative",
      "section": "strategy",
      "id": "strategy-creative-fatigue-refresh",
      "when": "훅률(3초 시청 유지율)이 최근 7일 대비 20% 이상 하락, CTR은 아직 안정적",
      "metric": "hook_rate_7d_change_pct",
      "condition": "<= -20",
      "action": "동일 바디·CTA에 신규 훅 3종 제작 및 교체 알림",
      "guardrail": "일예산 5,000달러 이상 캠페인은 교체 주기 3~5일로 단축, 신규 훅 검토 없이 자동 중단 금지",
      "confidence": "medium"
    },
    {
      "docId": "strategy-measurement",
      "section": "strategy",
      "id": "strategy-mer-below-target",
      "when": "블렌디드 MER이 14일 이동평균 기준 목표 하단(2.5배) 미달",
      "metric": "blended_mer_14d",
      "condition": "< 2.5",
      "action": "채널별 ROAS 합산치와 MER 격차(중복계산 규모) 리포트 생성, 예산 재검토 알림",
      "guardrail": "신제품 런칭 직후 30일은 예외(초기 학습기), 단일 채널 ROAS만으로 자동 예산 조정 금지",
      "confidence": "medium"
    },
    {
      "docId": "strategy-geo-aeo",
      "section": "strategy",
      "id": "strategy-content-freshness-geo",
      "when": "핵심 트래픽 상위 페이지가 90일 이상 미갱신",
      "metric": "days_since_content_update",
      "condition": ">= 90",
      "action": "콘텐츠 갱신 작업 티켓 생성 알림(30일 이내 갱신 시 인용 3.2배 근거)",
      "guardrail": "정적 레퍼런스성 페이지(약관 등)는 제외",
      "confidence": "medium"
    },
    {
      "docId": "strategy-geo-aeo",
      "section": "strategy",
      "id": "strategy-schema-coverage-check",
      "when": "핵심 페이지에 FAQPage/Article/Product/Organization 구조화 데이터 중 하나도 미검출",
      "metric": "schema_any_present",
      "condition": "== false",
      "action": "구조화 데이터 적용 우선순위 리스트 생성 알림",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "strategy-geo-aeo",
      "section": "strategy",
      "id": "strategy-ai-referral-tracking-missing",
      "when": "GA4 채널 그룹에 AI 챗봇 리퍼럴(chatgpt.com/perplexity.ai/gemini.google.com/copilot.microsoft.com) 커스텀 그룹 미설정",
      "metric": "ga4_ai_referral_channel_configured",
      "condition": "== false",
      "action": "커스텀 채널 그룹 설정 작업 알림",
      "guardrail": "없음",
      "confidence": "low"
    },
    {
      "docId": "strategy-evergreen",
      "section": "strategy",
      "id": "strategy-evergreen-below-breakeven-persist",
      "when": "캠페인 ROAS가 손익분기 ROAS 미만으로 14일 연속(마진 반영 재계산 기준)",
      "metric": "roas_14d_margin_adjusted",
      "condition": "< breakeven_roas",
      "action": "예산 축소·중단 검토 알림, 인지 목적 캠페인은 하위퍼널 신호로 재평가",
      "guardrail": "런칭 후 30일 학습기·인지 목적 태그 캠페인 제외",
      "confidence": "high"
    },
    {
      "docId": "strategy-evergreen",
      "section": "strategy",
      "id": "strategy-evergreen-single-variable-test-enforce",
      "when": "캠페인/소재 변경 요청에 훅·바디·CTA·타겟·입찰 중 2개 이상 변수가 동시 포함",
      "metric": "changed_variable_count",
      "condition": ">= 2",
      "action": "변경 요청 분할 제안(변수 1개씩 순차 적용)",
      "guardrail": "정책 위반·클레임 등 긴급 대응은 예외로 다중 변경 허용",
      "confidence": "high"
    },
    {
      "docId": "strategy-evergreen",
      "section": "strategy",
      "id": "strategy-evergreen-legacy-tactic-flag",
      "when": "계정에 SKAG(예외 목록 외) 또는 2026-01-15 이전 세팅된 상세타겟팅 관심사 스태킹이 잔존",
      "metric": "legacy_structure_detected",
      "condition": "== true",
      "action": "구조 전환 작업 티켓 생성(STAG 통합 또는 광범위 타겟팅 전환)",
      "guardrail": "고가치 키워드 10~20개 SKAG 예외 목록은 대상 제외",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-timerange-window-exceeded",
      "when": "통계 조회 요청의 timeRange가 reportTp/breakdown 조합별 허용 윈도우(breakdown 없음 92일, 파워링크류 breakdown 7일, 브랜드검색·플레이스 breakdown 90일 등)를 초과",
      "metric": "requested_window_days",
      "condition": "> allowed_window_days[reportTp, breakdown]",
      "action": "요청 기간을 허용 상한으로 자동 축소 후 재요청, 축소분은 분석 리포트에 '기간절단' 주석 첨부",
      "guardrail": "축소 후에도 실패(4xx) 시 재시도 금지, 원본 요청 범위를 로그에 보존",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-datepreset-timerange-conflict",
      "when": "요청 파라미터에 timeRange와 datePreset이 동시 존재",
      "metric": "has_both_timerange_datepreset",
      "condition": "== true",
      "action": "timeRange를 유효값으로 채택하고 datePreset은 무시된 사실을 분석 메타데이터에 기록",
      "guardrail": "무시된 datePreset 값을 삭제하지 않고 로그에만 남김(재현성 확보)",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-breakdown-multi-value",
      "when": "breakdown 파라미터에 pcMblTp/dayw/hh24/regnNo 중 2개 이상 지정",
      "metric": "breakdown_value_count",
      "condition": "> 1",
      "action": "요청을 단일 breakdown별로 분리 재요청",
      "guardrail": "분리 재요청은 최대 4회(enum 종류 수)까지만, 초과 시 알림",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-fields-enum-whitelist",
      "when": "fields 요청값 또는 응답 컬럼명이 19개 공식 enum(impCnt~purchaseRor) 밖",
      "metric": "unknown_field_count",
      "condition": "> 0",
      "action": "미확인 필드는 파싱 매핑 테이블에서 제외하고 별도 로그, 분석 결론에는 사용 금지",
      "guardrail": "신규 필드 발견 시 자동 채택 금지, 사람이 매핑표에 추가할 때까지 격리",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-cyclebasetm-freshness-lag",
      "when": "응답 report의 status가 CHANGED이거나, cycleBaseTm과 분석 실행 시각의 차이가 예외 허용폭을 초과",
      "metric": "cyclebasetm_lag_hours",
      "condition": "report_status == 'CHANGED' OR cyclebasetm_lag_hours > 48",
      "action": "해당 배치 결과에 '데이터 지연/변경' 플래그 부여, 결론 신뢰도 confidence를 한 단계 하향, 48시간 경과 후 재조회해 최종치로 갱신",
      "guardrail": "공식 근거 확인(2026-08-23 2라운드, 공지 2025-09-26 적용 2025-10-27): STATS API 표준 지연 3시간→2시간 단축, cycleBaseTm 분단위 갱신. 무효클릭 제거·외부매체 지연·시스템 문제 시에만 최대 48시간 이내 재변경 가능하며 이 경우 리포트가 CHANGED로 마킹됨 — 종전 25시간 설계값 폐기, 2시간(정보성)/48시간(플래그)+CHANGED 상태를 공식 임계치로 채택",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-ad-type-unmapped",
      "when": "수집된 Ad.type 값이 공식 15종 enum(TEXT_45/SHOPPING_PRODUCT_AD/.../DOOH_AD) 밖",
      "metric": "unmapped_ad_type_count",
      "condition": "> 0",
      "action": "해당 소재를 파싱 파이프라인에서 격리, 신규 type 후보로 알림",
      "guardrail": "격리된 소재는 자동으로 성과 분석/제안 단계에 넘기지 않음",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-avgrnk-null-misclassified",
      "when": "avgRnk가 null인데 파싱 로직이 이를 '결측 오류'로 태깅(캠페인 유형이 PC 파워링크+비즈사이트/모바일 파워링크가 아닌 경우는 정상)",
      "metric": "avgrnk_false_missing_flag_count",
      "condition": "> 0",
      "action": "캠페인/그룹 유형 화이트리스트로 재판정, 정상 결측은 오류 카운트에서 제외",
      "guardrail": "화이트리스트 변경은 공식 문서 갱신 시에만",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-masterreport-item-missing",
      "when": "분석에 필요한 Master Report item(Campaign/Adgroup/Ad/Keyword/AdExtension/Qi/AdQi 등)이 최근 스냅샷에서 누락",
      "metric": "missing_required_item_types_count",
      "condition": "> 0",
      "action": "누락 item으로 마스터 리포트 재생성 요청 후 해당 분석은 보류",
      "guardrail": "재생성 요청은 동일 item에 대해 시간당 1회로 제한(백엔드 큐 부하 고려)",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-input-data-parsing",
      "section": "verify",
      "id": "verify-analyze-naver-sample-size-below-threshold",
      "when": "분석 대상 키워드/소재의 최근 7일 impCnt 또는 clkCnt가 설계 임계치(제안: imp<200 또는 clk<5) 미만",
      "metric": "sample_impressions_or_clicks",
      "condition": "impCnt < 200 OR clkCnt < 5",
      "action": "해당 항목 결론에 '표본부족' 라벨 부여, 신뢰도 confidence를 low로 강제 하향",
      "guardrail": "공식·업계 근거 없음(2026-08-23 조사) — 네이버 API/도움말 어디에도 최소 노출·클릭 표본수 가이드 없음(자동입찰 FAQ 1350도 '충분한 클릭 및 전환'이라고만 하고 수치 미제시). imp<200/clk<5는 설계값(제안) 유지, 업종·채널별 재보정 필요",
      "confidence": "low",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-inspect-status-denied-signal",
      "when": "소재/키워드의 inspectStatus=DENIED 이거나 status/statusReason에 *_DISAPPROVED 계열 값 관측",
      "metric": "policy_violation_candidate_flag",
      "condition": "inspectStatus == 'DENIED' OR statusReason LIKE '%_DISAPPROVED' OR statusReason LIKE '%_DENIED'",
      "action": "정책위반 후보로 1차 분류, inspect-history 조회 큐에 등록",
      "guardrail": "1차 분류만 수행, 자동 소재 중지·롤백은 setup/selfcheck 단계 규칙에 위임",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-keyword-statusreason-nonstandard",
      "when": "AdKeyword.statusReason 값이 공식 enum 4종(KEYWORD_DELETED/PAUSED/DISAPPROVED/UNDER_REVIEW) 밖(예: KEYWORD_DENIED)",
      "metric": "nonstandard_statusreason_count",
      "condition": "> 0",
      "action": "파싱 오류로 폐기하지 않고 '비표준 반려사유' 태그로 보존, 반려 후보에 포함",
      "guardrail": "폐기 금지 — Ad.statusReason과의 정의 불일치가 원인일 수 있음",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-inspect-history-evidence-required",
      "when": "정책위반 후보로 분류된 엔티티에 대해 /api/ncc/inspect-history 원문 사유 미확보",
      "metric": "missing_inspect_comment_count",
      "condition": "> 0",
      "action": "inspect-history API 재호출(단건 GET), 404(이력없음) 시 '사유 미확보'로 결론에 명시",
      "guardrail": "원문 미확보 상태로 정책위반 확정 결론 발행 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-errorcode-policy-crosscheck",
      "when": "최근 세팅/배치 응답 로그에 3909(금지키워드)/3606(등록불가URL)/3822(중복소재) 코드 발생 이력이 있으나 해당 엔티티가 위반후보 목록에 없음",
      "metric": "uncorrelated_policy_errorcode_count",
      "condition": "> 0",
      "action": "해당 엔티티를 위반 후보 목록에 소급 추가",
      "guardrail": "에러코드 로그 보존기간(예: 최근 30일)을 벗어난 이력은 사용하지 않음",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-dynamic-insertion-abuse-severity",
      "when": "에러코드 3819(동적 키워드 삽입 과다 사용) 발생",
      "metric": "dynamic_insertion_abuse_flag",
      "condition": "== true",
      "action": "반려(DISAPPROVED)와 분리해 '경고' 심각도로 별도 집계",
      "guardrail": "경고 누적 건수만으로 자동 소재 중지 금지, 알림만",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-qi-signal-incomplete-hold",
      "when": "qiGrade, adRelevanceScore, expectedClickScore가 모두 null/0(집계 전 신규 소재로 추정)",
      "metric": "qi_signal_present_count",
      "condition": "== 0",
      "action": "해당 소재의 성과/품질 관련 결론을 '보류'로 표시, 자동 제안 단계로 전달 금지",
      "guardrail": "보류 상태는 다음 배치에서 재평가, 영구 보류 금지(최대 7일)",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-qi-grade-confidence-scaling",
      "when": "소재 type이 파워링크가 아니고, nccQi.qiGrade가 존재하고 공식 하위 구간(1~2등급, '광고 품질이 좋지 않음')",
      "metric": "qi_grade",
      "condition": "ad_type != 'POWERLINK' AND qi_grade IN [1,2]",
      "action": "해당 소재 관련 성과분석 결론의 confidence를 한 단계 하향(high→medium, medium→low)",
      "guardrail": "등급 구간 경계(1~2=좋지않음/3~5=보통/6~7=높음)는 ads.naver.com FAQ 1084 공식 정의(2026-08-23 확인) — confidence 하향 대상을 3등급까지 넣는 것은 과잉이므로 1~2등급으로 축소. 2라운드 정정: 파워링크는 2026-07-29부터 nccQi가 고정값(4)만 반환하므로([공지 2026-06-30] 파워링크 QI 항목 종료) ad_type 조건으로 파워링크를 제외해야 함 — 미제외 시 항상 3~5등급으로 판정돼 confidence 하향이 영구히 발동하지 않는 오탐 발생",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-comparative-superlative-evidence-missing",
      "when": "소재 텍스트에 비교('~보다 저렴' 등 특정업체 비교)/최상급/수상·공인·선정/순위·점유율·확률/공식·독점·총판·유일 계열 문구가 있는데 검토요청 소명자료 첨부 이력이 없음",
      "metric": "unsubstantiated_superlative_claim_count",
      "condition": "> 0",
      "action": "정책위반 리스크 후보로 태깅(반려 확정 아님), 소명자료 첨부 여부 재확인 요청",
      "guardrail": "특정 업체를 직접 특정한 비교문구는 소명자료 유무와 무관하게 게재 불가([FAQ 242]) — 이 경우는 즉시 위반후보 최상위로 분류",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-medical-ad-review-compliance",
      "when": "소재 type이 병의원/의료광고(MEDICAL_AD 등)인데 심의필번호 미기재이거나, 확장소재가 전화번호·예약·서브링크 외 유형이거나, 반응형 소재로 등록됐거나, 최초 심의일로부터 3년(만료) 또는 2.5년(재심의 권고 시점) 경과",
      "metric": "medical_ad_compliance_violation_count",
      "condition": "missing_review_number OR extension_type NOT IN ['CALL','RESERVATION','SUBLINK'] OR creative_format == 'RESPONSIVE' OR years_since_review >= 2.5",
      "action": "정책위반 후보(의료광고 사전심의 미준수)로 분류, 심의필번호·소명근거 재확인 요청. years_since_review>=2.5는 재심의 신청 리마인더로 별도 알림(만료 전 6개월)",
      "guardrail": "공식 근거 확인(2026-08-23 2라운드, ads.naver.com FAQ 1026): 심의 유효기간 3년, 만료 6개월 전 재심의 신청 필요, 심의필번호(의/치/한+5자리, 브랜드검색 제외), 병의원은 반응형 소재 등록 불가(단일형만), 확장소재는 전화번호·예약·서브링크만 허용. 2018-09-28 개정 의료법 시행 이전 등록 소재는 적용 제외 — 소재 등록일 확인 후 제외 처리",
      "confidence": "high",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-naver-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-naver-nonmedical-industry-license-gate",
      "when": "소재/사업자 업종이 인허가 필요 업종(통신판매업·의료기기 판매·건강기능식품 판매·대부업/대부중개업·에스크로 등 FAQ 386 15개 업종)인데 광고주 인허가·신고 등록정보가 확인되지 않음",
      "metric": "unverified_license_industry_flag",
      "condition": "== true",
      "action": "정책위반 후보(업종 인허가 미확인)로 분류, 사업자의 인허가/신고 서류 제출 이력 재확인 요청",
      "guardrail": "2026-08-23 2라운드: ads.naver.com FAQ 386/393에서 업종별 인허가 목록과 광고 제한 사유 목록을 공식 확인(confidence low→medium 상향). 다만 표현·문구 자체(예: 금융/식품 전용 금칙어 리스트)에 대한 별도 수치 임계치는 여전히 발견되지 않아 문구 매칭 부분은 설계값(제안)으로 유지 — 인허가 게이트 미확인만으로 자동 소재 중지 금지, 알림만",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "naver"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-prohibited-product-category",
      "stage": "analyze",
      "channel": "coupang",
      "when": "소재 상품 카테고리가 광고 불가 목록(성인용품·담배/전자담배·주류·호신용품·무기류·마약류·헌혈증·불법복제물·의약품 등)에 해당",
      "metric": "product_category",
      "condition": "product_category IN prohibited_category_list",
      "action": "분석 결과 '차단' 확정, 세팅 단계 전달 금지, 담당자 알림",
      "guardrail": "카테고리 목록 갱신은 정책 문서 재확인 후에만 반영",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-excluded-keyword-match",
      "stage": "analyze",
      "channel": "coupang",
      "when": "소재 키워드가 법령위반 소지·등록상표 유사·배송조건 키워드(무료배송/로켓배송 등)·비속어 중 하나에 해당",
      "metric": "excluded_keyword_hits",
      "condition": ">= 1",
      "action": "해당 키워드를 '제외 후보'로 표시, 세팅 단계 키워드 목록에서 사전 제거 제안",
      "guardrail": "등록상표 유사 판정은 오탐 가능성 있어 사람 확인 후 최종 제외",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-editorial-pattern-flag",
      "stage": "analyze",
      "channel": "coupang",
      "when": "소재 텍스트/이미지 설명에서 선정성·음란, 폭력·혐오·공포, 성별/인종/종교/장애/질병 차별 표현 패턴 탐지",
      "metric": "editorial_violation_hits",
      "condition": ">= 1",
      "action": "'심의 위반 의심' 라벨 부여, 세팅 단계 전달 보류",
      "guardrail": "자동화는 의심 판정까지만, 최종 게재 승인/반려는 사람이 결정",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-ip-infringement-signal",
      "stage": "analyze",
      "channel": "coupang",
      "when": "미승인 브랜드 로고·상표 노출, 라이선스 미확인 저작물 재사용, 유명인 초상/성명 무단 사용 신호 탐지",
      "metric": "ip_risk_hits",
      "condition": ">= 1",
      "action": "소재 보류, 라이선스·이용허락 증빙 요청",
      "guardrail": "증빙 확인 전까지 세팅 단계 전달 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-superlative-claim-evidence-missing",
      "stage": "analyze",
      "channel": "coupang",
      "when": "'1위/NO.1/최다판매/세계 최초/국내 최초/인증 획득/연속 수상' 등 문구가 있는데 조사기간·인증기관·조사대상·범위 4요소 중 일부가 소재/근거자료에 없음",
      "metric": "evidence_fields_present",
      "condition": "< 4",
      "action": "증빙 4요소 첨부 요청, 미비 상태로 세팅 단계 전달 금지",
      "guardrail": "증빙 첨부 없는 최상급 표현은 문구 삭제 대안으로 제안",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-unsubstantiated-comparison",
      "stage": "analyze",
      "channel": "coupang",
      "when": "경쟁사를 특정하며 불리한 사실만 나열하거나 출처 없는 비교 표현 탐지",
      "metric": "comparison_claim_hits",
      "condition": ">= 1 AND source_citation_present = false",
      "action": "'허위/과장 비교 의심' 라벨, 사람 확인 요청",
      "guardrail": "자사 제품군 내부 비교(예: 자사 구제품 대비)는 예외 검토",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-click-fraud-signal",
      "stage": "analyze",
      "channel": "coupang",
      "when": "CTR이 계정 평균 대비 급등하거나 짧은 시간 내 동일 소스 반복 클릭 패턴 탐지",
      "metric": "ctr_zscore, repeated_click_burst_count",
      "condition": "ctr_zscore > 3 OR repeated_click_burst_count > 0",
      "action": "부정클릭 의심 태그, 원인 조사 요청(이용약관 제8조 제5항 근거)",
      "guardrail": "쿠팡은 '부정 클릭 탐지 시스템을 상시 운영'한다고 명시하나[faq] 판정 배율·건수 임계치는 비공개(고정 수치 없음, 2026-08-23 policy/faq 원문 재확인) — CTR z-score>3, burst>0 임계치 자체는 설계값(제안) 유지, 오탐 시 계정 제재 조치는 사람 판단으로만",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-creative-change-frequency-exceeded",
      "stage": "analyze",
      "channel": "coupang",
      "when": "동일 캠페인의 소재교체 요청이 최근 7일 내 1회를 초과",
      "metric": "creative_change_count_7d",
      "condition": "> 1",
      "action": "초과 요청을 예외 승인 대기열로 이동, 사유 기록 요구",
      "guardrail": "MADA 소재교체는 주 1회 원칙, 예외는 담당 채널과 사전 협의 필요",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-creative-submission-window",
      "stage": "analyze",
      "channel": "coupang",
      "when": "소재교체 요청 제출 시각이 영업일 10~18시를 벗어남",
      "metric": "submit_time",
      "condition": "NOT IN business_hours(10,18) OR NOT is_business_day(submit_date)",
      "action": "다음 영업 가능 시간대로 큐잉, 담당자 알림",
      "guardrail": "긴급 반영 요청은 자동 큐잉을 우회하지 않고 별도 승인 경로로만 처리",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-creative-lead-time-violation",
      "stage": "analyze",
      "channel": "coupang",
      "when": "신규 소재 제출일과 집행 예정일 사이 영업일 수가 7일 미만",
      "metric": "business_days_between(submit_date, planned_start_date)",
      "condition": "< 7",
      "action": "집행 예정일을 영업일 7일 이후로 재조정 제안 또는 심의 지연 리스크 고지",
      "guardrail": "MADA 소재는 원활한 집행을 위해 영업일 7일 전 전달을 전제로 계획",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-policy-creative-safety",
      "section": "verify",
      "id": "verify-analyze-coupang-unpaid-fee-suspension-risk",
      "stage": "analyze",
      "channel": "coupang",
      "when": "이용료 미납 일수가 상품광고 1개월 또는 배너광고 2개월 중지 기준에 근접",
      "metric": "unpaid_days, product_type",
      "condition": "(product_type == 'MADA' AND unpaid_days >= 24) OR (product_type == 'banner' AND unpaid_days >= 48)",
      "action": "결제 리스크 경보 태그를 분석 결론에 첨부, 정산 담당자 알림",
      "guardrail": "공식 중지 기준 원문(2026-08-23 재확인): 상품광고는 이용약관 제11조 제2항 '이용료 결제를 1개월 이상 지체하는 경우 ... 상품광고를 중지할 수 있으며, 3개월 이상 연체하는 경우 본 계약을 즉시 해지', 배너광고는 제9조 제2항 '광고비 결제를 2개월 이상 지체하는 경우 ... 즉시 배너광고 서비스를 중지할 수 있으며, 3개월 이상 연체하는 경우 ... 해지'[policy]. 조기경보 배율(80%=24일/48일) 자체는 공식 기준 없는 설계값(제안)",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-attribution-window-immature",
      "stage": "analyze",
      "channel": "coupang",
      "when": "리포트 조회 종료일이 오늘 기준 14일 이내",
      "metric": "report_end_date",
      "condition": "report_end_date > today - 14d",
      "action": "해당 구간을 '전환 미확정(잠정)'으로 라벨링, 트렌드 결론에서 제외",
      "guardrail": "귀속기간 내 구간을 확정치로 표기 금지, 최종 결론은 종료일<=today-14d 구간만 사용",
      "confidence": "high",
      "source": "ads.coupang.com/analysis: 광고 클릭 후 14일 이내 구매를 전환으로 집계"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-optimization-period-lock",
      "stage": "analyze",
      "channel": "coupang",
      "when": "매출최적화/AI스마트 광고의 목표 설정이 변경된 지 14일이 지나지 않음",
      "metric": "days_since_last_target_change",
      "condition": "< 14",
      "action": "해당 구간 성과를 '최적화 중'으로 표기, 개선/악화 결론 보류",
      "guardrail": "이 구간 데이터를 근거로 목표 재변경 제안 생성 금지",
      "confidence": "high",
      "note": "FAQ 원문 '약 7일에서 14일 정도 소요'(2026-08-23 재확인) — 14일은 공식 권고 범위의 상단을 그대로 채택한 값, 설계값 아님",
      "source": "https://ads.coupang.com/faq, https://ads.coupang.com/Faq.html"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-ctr-recount-mismatch",
      "stage": "analyze",
      "channel": "coupang",
      "when": "재계산 CTR(클릭수/노출수×100)과 리포트 원본 CTR 셀 값 차이",
      "metric": "abs(recomputed_ctr - reported_ctr)",
      "condition": "> 0.01",
      "action": "파싱 오류로 판정, 원본 엑셀 재파싱(인코딩·천단위 콤마·병합셀 점검)",
      "guardrail": "재계산값을 우선 신뢰, 원본 셀 값 단독 사용 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-cpc-recount-mismatch",
      "stage": "analyze",
      "channel": "coupang",
      "when": "재계산 CPC(집행광고비÷클릭수)와 리포트 원본 CPC 셀 값 차이",
      "metric": "abs(recomputed_cpc - reported_cpc)",
      "condition": "> 1",
      "action": "파싱 오류 판정 후 재파싱, 클릭수 0인데 CPC 값이 존재하면 별도 이상치 처리",
      "guardrail": "클릭수=0 구간의 CPC는 결측(null)로 취급, 0으로 대체 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-roas-calc-mismatch",
      "stage": "analyze",
      "channel": "coupang",
      "when": "재계산 광고수익률(광고전환매출÷광고비×100)이 리포트 표기 수익률과 불일치, 또는 목표ROAS 컬럼값을 실적ROAS로 사용",
      "metric": "abs(recomputed_roas - reported_roas) OR column_role_ambiguous",
      "condition": "> 1 OR column_role_ambiguous = true",
      "action": "컬럼 매핑 재확인 후 재계산, 목표/실적 컬럼 라벨을 명시적으로 분리",
      "guardrail": "컬럼 역할 불확실 시 해당 지표를 결론에 미사용",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-schema-drift",
      "stage": "analyze",
      "channel": "coupang",
      "when": "리포트 헤더 집합이 기준 스키마와 다름(신규/누락/이름변경 컬럼 존재)",
      "metric": "header_diff_count",
      "condition": "> 0",
      "action": "파싱 중단, 신규 컬럼 매핑 정의 후 재실행",
      "guardrail": "미지 컬럼을 기존 컬럼으로 추정 매핑 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-missing-date-rows",
      "stage": "analyze",
      "channel": "coupang",
      "when": "조회 기간 내 특정 날짜 행이 리포트에 존재하지 않음",
      "metric": "missing_dates_count",
      "condition": "> 0",
      "action": "결측 구간 원인(집행정지/승인지연) 조사 요청, 결측일은 평균·보간 없이 결론에서 제외",
      "guardrail": "결측일을 0 또는 인접일 평균으로 채워 넣지 않는다",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-low-sample-warning",
      "stage": "analyze",
      "channel": "coupang",
      "when": "분석 대상 구간의 누적 노출수 또는 클릭수가 최소치 미만",
      "metric": "impressions_period, clicks_period",
      "condition": "impressions_period < 1000 OR clicks_period < 30",
      "action": "결론에 '표본 부족(참고용)' 태그 부여, 액션 제안 단계로 자동 전달 금지",
      "guardrail": "쿠팡 공식(analysis, analysis/03, analysis/04, faq, Faq.html)에 표본 최소치 기준 없음(2026-08-23 재확인), 업계 공개 벤치마크도 미확인 — 공식·업계 근거 없음(2026-08-23 조사), 표본 임계값은 설계값(제안)으로 채널·카테고리별 조정 가능",
      "confidence": "low"
    },
    {
      "docId": "verify-analyze-coupang-report-data-validity",
      "section": "verify",
      "id": "verify-analyze-coupang-budget-cap-vs-spend-confusion",
      "stage": "analyze",
      "channel": "coupang",
      "when": "일예산(집행 상한) 필드를 집행광고비(실사용액) 필드와 동일하게 취급한 계산식 사용",
      "metric": "denominator_field_used",
      "condition": "denominator_field_used == 'daily_budget_cap'",
      "action": "소진율·ROAS 계산의 분모를 집행광고비로 교정, 상한 필드는 별도 지표(예산 소진률 상한 대비)로만 사용",
      "guardrail": "일예산=상한, 집행광고비=실사용액이라는 정의를 코드 주석/스키마에 고정",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-date-preset-silent-default",
      "when": "분석 요청에 date_preset/time_range가 지정되지 않음",
      "metric": "requested_period_label",
      "condition": "== '사용자 지정' AND actual_date_preset == 'last_30d(API 기본값)'",
      "action": "기간 라벨을 'last_30d(API 기본값)'으로 재기록하고 분석 결론에 기본값 적용 사실을 명시",
      "guardrail": "사용자가 명시적으로 date_preset/time_range를 지정한 케이스는 이 규칙 적용 제외",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-attribution-window-consistency",
      "when": "둘 이상의 소재/기간을 비교하는 분석에서 attribution_setting 또는 action_attribution_windows 값이 서로 다름",
      "metric": "attribution_window_set_diff_count",
      "condition": "> 0",
      "action": "비교 대상 전체를 동일 attribution_setting(기본값 7d_click,1d_view)으로 재조회 후 비교",
      "guardrail": "재조회 불가 시 비교 결론 자체를 '무효'로 표시하고 액션 근거로 사용 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-estimated-metric-trend-misuse",
      "when": "추세 비교·전략 판단 결론이 Estimated 또는 In Development 라벨 지표에만 근거",
      "metric": "estimated_or_dev_metric_only",
      "condition": "== true",
      "action": "결론 문구를 확정형에서 '추정상 경향' 등 잠정형으로 강제 치환, 확정 지표 교차검증 요구",
      "guardrail": "이 지표만으로 예산·입찰 변경 액션을 트리거하는 결론 생성 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-ios145-null-misread",
      "when": "iOS 14.5 이후 캠페인과 이전 캠페인을 같은 조회에 섞어 non-inline 전환 지표를 집계",
      "metric": "mixed_ios145_query_detected",
      "condition": "== true AND non_inline_conversion_metric IN [null, 0]",
      "action": "두 그룹을 분리 조회 후 재집계, 분리 전 결과는 '조회 오류'로 재분류(성과 없음 아님)",
      "guardrail": "null/0 값을 자동으로 '성과 없음'으로 해석해 액션 생성 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-creative-story-ref-missing",
      "when": "소재 파싱 시 object_story_spec, object_story_id, effective_object_story_id 세 필드 모두 없음",
      "metric": "story_reference_present",
      "condition": "== false",
      "action": "해당 소재를 파싱 실패로 격리하고 원본 계정에서 1회 재조회",
      "guardrail": "재시도 2회 초과 시 자동 처리 중단, 사람 확인 대기열로 이관",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-asset-reference-dangling",
      "when": "image_hash 또는 video_id가 참조하는 이미지/영상 오브젝트가 조회 불가(삭제·권한 없음)",
      "metric": "dangling_asset_reference_count",
      "condition": "> 0",
      "action": "해당 소재를 분석 모집단에서 제외하고 '삭제된 자산 참조' 오류로 로그",
      "guardrail": "대체 자산을 추정해 분석에 대입 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-cta-type-unknown-enum",
      "when": "파싱된 call_to_action_type 값이 공식 enum 목록에 없는 문자열",
      "metric": "unknown_cta_enum_count",
      "condition": "> 0",
      "action": "해당 소재의 CTA 태그를 '미분류'로 표시",
      "guardrail": "미분류 상태로 CTA 유형별 성과 비교 결론 생성 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-dynamic-creative-flatten-error",
      "when": "asset_feed_spec(Dynamic Creative)이 있는 소재를 단일 고정 소재(이미지 1+카피 1)로 취급해 분석",
      "metric": "dynamic_creative_flattened_as_single",
      "condition": "== true",
      "action": "asset_feed_spec 배열과 degrees_of_freedom_spec을 조합형으로 재파싱해 요소군 단위로 재집계",
      "guardrail": "조합형 소재의 합성 성과를 단일 소재 성과인 것처럼 리포트 노출 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-data-window-parsing",
      "section": "verify",
      "id": "verify-analyze-meta-level-breakdown-double-count",
      "when": "서로 다른 insights level(account/campaign/adset/ad) 결과를 합산해 상위 지표를 재계산",
      "metric": "cross_level_summation_detected",
      "condition": "== true",
      "action": "합산 대신 목표 level로 재조회해 지표 대체",
      "guardrail": "level 혼합 합산 결과를 최종 리포트에 노출 금지(설계값 — 공식 경고문 아님)",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-unacceptable-content-block",
      "when": "카피/이미지 텍스트/영상 대사에서 금지 콘텐츠 카테고리(아동 성적 착취, 범죄 촉진, 차별, 혐오 표현, 인간 착취, 백신 거부 유도, 반박된 허위정보) 패턴 탐지",
      "metric": "unacceptable_content_pattern_hit",
      "condition": "== true",
      "action": "판정을 '차단'으로 즉시 격상, 세팅 단계 전달 파이프라인에서 제외",
      "guardrail": "차단 판정은 자동 해제 금지, 사람 재검토만 해제 가능",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-personal-attributes-detect",
      "when": "카피가 인종·민족·종교·신념·나이·성적지향·성정체성·장애·신체정신건강 등 개인 속성을 직접 또는 간접(2인칭 지칭)으로 주장·암시",
      "metric": "personal_attribute_pattern_hit",
      "condition": "== true",
      "action": "판정을 '정책 의심'으로 라벨링하고 탐지 근거 문구를 레코드에 첨부",
      "guardrail": "자동 차단 금지, 최종 판단은 사람 승인 대기열에서만",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-restricted-category-flag",
      "when": "주류·담배·무기·암호화폐·온라인 도박·의약품·건강 및 웰니스 제품 키워드 탐지",
      "metric": "restricted_category_detected",
      "condition": "== true",
      "action": "업종 라벨 부여, 인증·연령 확인 여부 기본값 '미확인'으로 설정",
      "guardrail": "인증 확인 전 자동으로 '통과' 라벨 부여 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-health-wellness-age-gate",
      "when": "건강·웰니스·다이어트 제품 광고 콘텐츠로 분류된 소재의 타겟 연령 하한이 18 미만",
      "metric": "target_age_min",
      "condition": "< 18",
      "action": "판정을 '정책 위반'으로 즉시 격상(공식 광고 기준이 18세 이상 타겟팅을 명문 요구)하고 연령 하한을 18 이상으로 상향 요구",
      "guardrail": "연령 필드 누락 시에도 통과로 처리하지 않고 '미확인'으로 표시, 확인 전 게시 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-ad-review-status-context",
      "when": "effective_status가 DISAPPROVED, PENDING_REVIEW, WITH_ISSUES 중 하나인 소재의 성과 지표를 분석에 포함",
      "metric": "effective_status",
      "condition": "IN ['DISAPPROVED','PENDING_REVIEW','WITH_ISSUES']",
      "action": "해당 소재 성과를 '판단 보류'로 표시하고 issues_info 원인 텍스트를 레코드에 첨부",
      "guardrail": "심사 미통과 상태의 성과를 '소재 부진'으로 결론짓는 액션 생성 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-configured-effective-drift",
      "when": "configured_status=ACTIVE 인데 effective_status가 CAMPAIGN_PAUSED, ADSET_PAUSED, PENDING_BILLING_INFO 등으로 다름",
      "metric": "status_drift_detected",
      "condition": "== true",
      "action": "데이터 공백 원인을 '구조/계정 문제'로 결론에 명시, 소재 성과 판단은 보류",
      "guardrail": "드리프트 상태에서 소재 교체·입찰 조정 액션 생성 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-judgment-reproducibility",
      "when": "동일 소재·동일 입력을 재분석했을 때 정책 판정 라벨 또는 신뢰도 점수가 이전 결과와 다름",
      "metric": "judgment_reproducibility_mismatch",
      "condition": "== true",
      "action": "재현 실패로 기록, 분류기·프롬프트 버전을 레코드에 남기고 해당 판정 유형 신뢰도 한 단계 하향",
      "guardrail": "재현 실패 판정 유형은 자동 액션 생성 파이프라인에서 제외",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-small-sample-confidence-downgrade",
      "when": "conversion류 optimization_goal 소재는 마지막 significant edit 이후 결과(전환) 수 < 50(메타 공식 학습단계 문서 원문 직접 확인, 2026-08-23 — Shops 광고는 웹 구매 17건+Meta 구매 5건 별도 기준); 그 외 캠페인은 노출 수 < 1,000 이거나 클릭 수 < 100 (설계값 제안, 공식 임계치 아님)을 보조 기준으로 사용",
      "metric": "results_since_last_significant_edit_or_impressions_or_clicks",
      "condition": "(is_conversion_goal AND NOT is_shops_ad AND results_since_last_significant_edit < 50) OR (is_conversion_goal AND is_shops_ad AND (web_purchases_since_edit < 17 OR meta_purchases_since_edit < 5)) OR (NOT is_conversion_goal AND (impressions < 1000 OR clicks < 100))",
      "action": "결론에 '표본 부족(학습 단계/데이터 축적 중)' 태그 부여, 확정 문구를 '잠정' 문구로 강제 치환",
      "guardrail": "표본 부족 태그가 붙은 결론으로 예산·입찰 액션 생성 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-meta-policy-confidence",
      "section": "verify",
      "id": "verify-analyze-meta-human-approval-routing",
      "when": "정책 의심, 표본 부족, 재현 실패 중 하나 이상이 동시에 존재하는 분석 결과를 세팅 단계로 전달하려 함",
      "metric": "unresolved_flag_count",
      "condition": "> 0",
      "action": "자동 전달 차단, 탐지 근거(패턴·필드·정책 원문)를 첨부해 사람 승인 대기열로 이관",
      "guardrail": "대기열 우회 경로(강제 전달 플래그) 사용 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "meta"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-pmax-min-assets",
      "stage": "analyze",
      "channel": "google",
      "when": "PMax 애셋 그룹이 헤드라인 3·긴 헤드라인 1·설명 2·가로 이미지 4·정사각 이미지 4·정사각 로고 1 최소 요건 미달인데 분석기가 '게재 가능'으로 판정",
      "metric": "pmax_min_requirement_met",
      "condition": "= false AND analyzer_verdict = 'eligible'",
      "action": "판정 무효, 누락 애셋 유형 목록 기록 후 재분석",
      "guardrail": "최소 요건 미달 그룹은 세팅 단계 전달 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-pmax-max-assets",
      "stage": "analyze",
      "channel": "google",
      "when": "이미지(가로/정사각/세로 각 유형별) 20·영상 15(애셋 그룹 전체 기준으로 우선 적용, 출처 간 방향별 기준 표기 상이하므로 재확인 필요)·헤드라인 15·긴 헤드라인 5·설명 5·로고 5 상한 초과 입력을 분석기가 그대로 수용",
      "metric": "asset_count_over_limit",
      "condition": ">= 1",
      "action": "상한 초과 플래그, 초과분 제외 목록 제안",
      "guardrail": "제외 대상은 사람이 선택, 자동 삭제 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-pmax-text-length",
      "stage": "analyze",
      "channel": "google",
      "when": "헤드라인 30자·긴 헤드라인 90자·설명 90자·비즈니스 이름 25자 한도 초과 또는 분석기 글자수와 재계산 불일치",
      "metric": "pmax_text_over_limit, recount_mismatch",
      "condition": "pmax_text_over_limit >= 1 OR recount_mismatch = true",
      "action": "글자수 계산 오류 플래그, 언어별 한도 재적용",
      "guardrail": "2바이트 언어는 별도 한도로 재검사 ('첫 설명 60자' 별도 한도는 공식 문서 미확인으로 폐기)",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-pmax-image-spec",
      "stage": "analyze",
      "channel": "google",
      "when": "이미지 비율이 1.91:1/1:1/4:5에 속하지 않거나 최소 해상도(600×314/300×300/480×600) 미달, 로고가 1:1(128×128)·4:1(512×128) 미달",
      "metric": "image_spec_violations",
      "condition": ">= 1",
      "action": "해당 이미지 '규격 미달' 라벨, 리사이즈/크롭 과제 생성",
      "guardrail": "자동 크롭 결과는 사람 확인 후 적용",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-pmax-no-video-warning",
      "stage": "analyze",
      "channel": "google",
      "when": "애셋 그룹 영상이 0개 또는 10초 미만·비유튜브 호스팅인데 분석기가 경고 없이 통과",
      "metric": "valid_video_count",
      "condition": "= 0 AND auto_video_warning = false",
      "action": "'자동 생성 영상 대체 위험' 경고 추가",
      "guardrail": "경고만 기록, 영상 없음 자체로 소재 기각 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-pmax-label-misread",
      "stage": "analyze",
      "channel": "google",
      "when": "분석기가 PMax 애셋 라벨 '낮음'을 절대 품질 불량으로, '학습 중'을 기각 사유로 사용",
      "metric": "label_used_as_absolute_score",
      "condition": "= true",
      "action": "해석 오류 플래그, 라벨은 '그룹 내 상대 평가' 필드로 분리",
      "guardrail": "'학습 중' 애셋 자동 기각 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-feed-required-attrs",
      "stage": "analyze",
      "channel": "google",
      "when": "피드 상품에 id·title·description·link·image_link·availability·price 중 누락, 또는 신상품 brand·부여된 gtin 누락",
      "metric": "missing_required_attrs",
      "condition": ">= 1",
      "action": "비승인 후보 라벨, 누락 속성 목록을 상품별로 기록",
      "guardrail": "gtin은 '부여된 경우'만 필수 — 자작 상품에 임의 gtin 생성 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-feed-price-availability-mismatch",
      "stage": "analyze",
      "channel": "google",
      "when": "피드 price/availability가 랜딩 페이지 스냅샷과 불일치하는 상품 비율이 기준 초과",
      "metric": "feed_landing_mismatch_rate",
      "condition": "> 0.02 (설계값 유지 — 공식: 고정 수치 없음)",
      "action": "피드 품질 '위험' 등급, 불일치 상품 목록 전달",
      "guardrail": "공식: 고정 수치 없음(출처: Shopping ads policies 6149970 — Misrepresentation 조항은 '정확·정직·진실된 표현'만 요구, 허용 오차율(%) 미명시. 2026-08-23 WebFetch 재확인). 2% 임계치는 설계값(제안)으로 유지, 스냅샷 시각 기록, 환율·세금 표시 차이는 별도 분류",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-feed-title-policy",
      "stage": "analyze",
      "channel": "google",
      "when": "title이 150자 초과, 전부 대문자, 프로모션 문구(무료배송·최저가·세일) 포함",
      "metric": "title_policy_hits",
      "condition": ">= 1",
      "action": "title 비승인 후보 라벨, 수정안 제안",
      "guardrail": "자동 수정안을 피드에 직접 반영 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-feed-image-policy",
      "stage": "analyze",
      "channel": "google",
      "when": "image_link 이미지가 최소 크기(500×500) 미달이거나 OCR로 프로모션 텍스트·워터마크·테두리 탐지",
      "metric": "feed_image_violations",
      "condition": ">= 1",
      "action": "'이미지 정책 의심' 라벨, 사람 확인 큐 등록",
      "guardrail": "OCR 오탐 가능 — 자동 비승인 처리 금지 (2026-08-23 확인: 최소 크기가 100×100/의류 250×250에서 500×500 공통 기준으로 변경됨)",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-video-length-format",
      "stage": "analyze",
      "channel": "google",
      "when": "범퍼 광고 영상이 6초 초과, 건너뛸 수 없는 인스트림이 60초 초과인데 분석기가 포맷 적합으로 판정",
      "metric": "video_duration_seconds, target_format",
      "condition": "(target_format = 'bumper' AND video_duration_seconds > 6) OR (target_format = 'non_skippable' AND video_duration_seconds > 60)",
      "action": "포맷 부적합 플래그, 허용 포맷 재매핑 제안",
      "guardrail": "2026-08-23 고객센터(2375464) 원문 확인: 건너뛸 수 없는 인스트림 한도는 60초이며 지역별 변형은 현재 문서에 없음 — 과거 15/20/30초 기준은 폐기",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-video-hosting-status",
      "stage": "analyze",
      "channel": "google",
      "when": "영상이 유튜브 비공개(Private) 상태이거나 유튜브 외 호스팅",
      "metric": "youtube_privacy_status",
      "condition": "NOT IN ['public','unlisted']",
      "action": "게재 불가 플래그, 분석 점수 보류",
      "guardrail": "공개 상태 변경은 사람이 수행",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-video-aspect-ratio",
      "stage": "analyze",
      "channel": "google",
      "when": "Shorts/세로 지면 타겟 영상이 9:16이 아니거나, 가로 지면 영상이 16:9·1:1이 아님",
      "metric": "aspect_ratio_match",
      "condition": "= false",
      "action": "지면-비율 불일치 경고, 대체 비율 버전 요청",
      "guardrail": "비율 불일치는 경고, 자동 기각 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-pmax-feed-video",
      "section": "verify",
      "id": "verify-analyze-google-cross-asset-consistency",
      "stage": "analyze",
      "channel": "google",
      "when": "피드 상품·PMax 애셋·랜딩 간 브랜드명 또는 가격대 불일치, 애셋 이미지가 피드 상품과 무관(분류기 유사도 0.5 미만)",
      "metric": "cross_asset_consistency_score",
      "condition": "< 0.5 (설계값·제안)",
      "action": "정합성 경고, 불일치 항목 목록 첨부",
      "guardrail": "공식·업계 근거 없음(2026-08-23 조사) — 피드·PMax 애셋·랜딩 간 유사도 분류기 자체가 이 위키의 내부 분석 시스템 구성요소이며 구글이 정의하는 지표가 아니므로 공식 임계값이 존재할 수 없음. 0.5는 설계값(제안)으로 유지, 분류기 임계값은 월 1회 사람 샘플 감사로 보정",
      "confidence": "low"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-rsa-asset-count",
      "stage": "analyze",
      "channel": "google",
      "when": "RSA 소재의 헤드라인이 3개 미만 또는 15개 초과, 설명이 2개 미만 또는 4개 초과인데 분석기가 '통과'로 판정",
      "metric": "headline_count, description_count",
      "condition": "headline_count NOT IN [3,15] OR description_count NOT IN [2,4]",
      "action": "분석 결과 무효 처리, 규격 위반 사유 기록 후 재분석",
      "guardrail": "규격 위반 소재는 세팅 단계로 전달 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-rsa-char-limit",
      "stage": "analyze",
      "channel": "google",
      "when": "헤드라인 30자(2바이트 언어 15자) 또는 설명 90자(2바이트 언어 45자) 초과 애셋이 있는데 분석기 글자수 필드와 재계산 값이 다름",
      "metric": "max_headline_len, max_description_len, recount_mismatch",
      "condition": "max_headline_len > limit OR max_description_len > limit OR recount_mismatch = true",
      "action": "분석기 글자수 계산 오류 플래그, 언어별 한도 재적용 후 재실행",
      "guardrail": "한국어 소재는 반드시 15/45 한도로 재검사",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-rsa-pin-coverage",
      "stage": "analyze",
      "channel": "google",
      "when": "핀이 걸린 위치에 애셋이 1개뿐이거나, 핀 때문에 조합 가능 수가 급감했는데 분석기가 이를 감점/경고하지 않음",
      "metric": "pinned_assets_per_position",
      "condition": "ANY(pinned_assets_per_position) = 1 AND pin_warning_flag = false",
      "action": "핀 커버리지 경고 추가, 고정 사유(법적 고지/브랜드) 입력 요구",
      "guardrail": "컴플라이언스 사유가 명시된 핀은 자동 해제 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-ad-strength-misuse",
      "stage": "analyze",
      "channel": "google",
      "when": "분석 점수 산식에 Ad Strength 등급이 성과 예측 가중치로 포함됨",
      "metric": "score_formula_includes_ad_strength_as_performance",
      "condition": "= true",
      "action": "해석 오류 플래그, Ad Strength는 '다양성 진단' 필드로 분리 표기",
      "guardrail": "Ad Strength '미흡'만으로 소재 자동 기각 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-duplicate-headlines",
      "stage": "analyze",
      "channel": "google",
      "when": "헤드라인 간 의미 중복(정규화 후 동일·유사도 0.9 이상)이 3쌍 이상인데 분석기가 다양성 점수를 높게 부여",
      "metric": "near_duplicate_pairs",
      "condition": ">= 3 AND diversity_score >= 0.8",
      "action": "다양성 점수 재계산, 중복 쌍 목록을 결과에 첨부",
      "guardrail": "공식·업계 근거 없음(2026-08-23 조사) — RSA 모범사례(6167122)는 \"Add as many unique headlines and descriptions as you can\"이라는 정성적 권고만 있을 뿐 유사도(%)·중복 쌍 수 등 정량 임계값은 어디에도 없음. 0.9 유사도·3쌍 임계값은 설계값(제안)으로 유지, 유사도 임계값 변경 시 과거 점수와 비교 금지",
      "confidence": "low"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-editorial-violation",
      "stage": "analyze",
      "channel": "google",
      "when": "과도한 대문자·반복 구두점(!!, ???)·헤드라인 느낌표·기호 남용·전화번호 삽입 등 편집 기준 위반 패턴 탐지",
      "metric": "editorial_violation_count",
      "condition": ">= 1",
      "action": "해당 애셋 '편집 기준 위반 의심' 라벨, 수정 제안 생성",
      "guardrail": "자동 수정본을 원본 대신 제출 금지, 사람 확인 후 반영",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-restricted-vertical",
      "stage": "analyze",
      "channel": "google",
      "when": "소재·랜딩에서 의료(의약품·시술·건강보조)·금융(대출·투자·암호화폐)·주류·도박·정치 키워드 탐지",
      "metric": "restricted_vertical_hits",
      "condition": ">= 1",
      "action": "'인증 필요 업종' 등급으로 상향, 인증 상태 확인 전 자동 세팅 차단",
      "guardrail": "자동화는 '의심'까지만 판단, 정책 최종 판정은 사람",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-prohibited-content",
      "stage": "analyze",
      "channel": "google",
      "when": "위조품·위험 제품·부정행위 조장·성인/혐오 콘텐츠 등 금지 콘텐츠 패턴 탐지",
      "metric": "prohibited_content_hits",
      "condition": ">= 1",
      "action": "소재 즉시 보류, 담당자 알림",
      "guardrail": "오탐 가능성 있어도 보류 우선, 해제는 사람만 가능",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-landing-reachability",
      "stage": "analyze",
      "channel": "google",
      "when": "최종 URL이 200이 아니거나 HTTPS가 아니거나 표시 URL 도메인과 불일치, 또는 자동 다운로드·팝업 차단 탐지",
      "metric": "landing_http_status, https, display_domain_match",
      "condition": "landing_http_status != 200 OR https = false OR display_domain_match = false",
      "action": "도착 페이지 요건 위반 플래그, 분석 점수 무효",
      "guardrail": "리디렉션 체인은 최종 도착지 기준으로 판단 (HTTPS 조건은 공식 도착 페이지 정책 문구가 아닌 일반 보안 모범사례 기준)",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-landing-speed",
      "stage": "analyze",
      "channel": "google",
      "when": "모바일 LCP가 2.5초 초과인데 분석기가 랜딩 품질을 '양호'로 판정",
      "metric": "mobile_lcp_seconds",
      "condition": "> 2.5 AND landing_quality = 'good'",
      "action": "랜딩 품질 등급 하향, 속도 개선 과제 생성",
      "guardrail": "측정은 동일 도구·동일 네트워크 프로파일로 3회 중앙값 사용",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-claim-landing-match",
      "stage": "analyze",
      "channel": "google",
      "when": "소재의 가격·할인율·무료배송·수상 등 구체 주장이 랜딩 본문에서 확인되지 않음",
      "metric": "unmatched_claims",
      "condition": ">= 1",
      "action": "허위 진술 위반 후보 라벨, 해당 애셋 보류",
      "guardrail": "동적 가격 페이지는 스냅샷 시각 기록 후 재확인",
      "confidence": "medium"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-score-reproducibility",
      "stage": "analyze",
      "channel": "google",
      "when": "동일 소재 3회 재분석 점수 표준편차가 허용치 초과",
      "metric": "score_stddev_3runs",
      "condition": "> 5 (100점 만점 기준, 설계값·제안)",
      "action": "점수 무효, 모델 버전·프롬프트 해시 기록 후 재실행",
      "guardrail": "공식·업계 근거 없음(2026-08-23 조사) — 이 '점수'는 이 위키의 내부 LLM 기반 분석 결과이지 구글이 발행하는 지표(Ad Strength 등)가 아니므로 애초에 구글 공식 출처가 존재할 수 없는 항목. 5점 임계치는 설계값(제안)으로 유지, 모델 버전 변경 시 과거 점수와 직접 비교 금지",
      "confidence": "low"
    },
    {
      "docId": "verify-analyze-google-rsa-policy",
      "section": "verify",
      "id": "verify-analyze-google-human-approval-gate",
      "stage": "analyze",
      "channel": "google",
      "when": "규격 불일치·정책 의심·인증 필요 업종·재현 실패 중 1개 이상 플래그",
      "metric": "blocking_flags",
      "condition": ">= 1",
      "action": "자동 세팅 전달 차단, 승인 대기열 등록",
      "guardrail": "승인자 식별자·시각을 결과에 기록해야 해제 가능",
      "confidence": "high"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-meta-data-not-final",
      "when": "메타 소재 데이터가 광고 종료 후 28일 미경과 상태인데 확정치로 사용",
      "metric": "days_since_ad_end_or_last_change",
      "condition": "< 28",
      "action": "provisional=true 라벨 부여, 자동 승패 판정 근거에서 제외",
      "guardrail": "28일 경과 후에도 재조회해 최종값과 대조 1회",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-ga4-late-event-window",
      "when": "GA4 이벤트 발생 후 72시간이 지나지 않은 구간을 최종 전환수로 집계",
      "metric": "hours_since_event",
      "condition": "< 72",
      "action": "해당 구간 provisional 처리, 72시간 경과 후 재집계",
      "guardrail": "실시간(리얼타임) 뷰 수치를 확정 리포트 수치로 오인 사용 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-timezone-normalization-missing",
      "when": "수집된 원본 레코드에 정규화된 KST 타임존 필드가 없거나 원본 타임존 필드가 유실됨",
      "metric": "normalized_tz_field_present, raw_tz_field_present",
      "condition": "normalized_tz_field_present == false OR raw_tz_field_present == false",
      "action": "적재 파이프라인 실패 처리, 재수집 큐로 이동",
      "guardrail": "정규화 실패 레코드는 분석 대상에서 자동 제외",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-naver-period-roundtrip",
      "when": "네이버 원본의 기간(period) 값이 KST 자정을 UTC로 표현한 형식(…T15:00:00.000Z)이 아님",
      "metric": "period_field_kst_midnight_valid",
      "condition": "== false",
      "action": "역변환 후 재검증, 실패 시 해당 캠페인 기간 데이터 분석 제외",
      "guardrail": "시·분·초가 0이 아닌 값은 원본 오류로 간주하고 수정 없이 격리",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-min-sample-size",
      "when": "소재 노출수가 500회 미만인데 비교·순위 결론(승/패, 우위)을 자동 산출",
      "metric": "impressions",
      "condition": "< 500",
      "action": "결론에 '표본 부족' 등급 부여, 자동 순위 산출 보류",
      "guardrail": "설계값(제안) — 노출수 기준 최소 표본에 대한 채널 공식 문서·업계 벤치마크는 여전히 미확보. 2026-08-23 Chrome 재조사에서 Meta 학습단계 공식 문서('약 50건 결과/마지막 유의미한 수정 후 1주')를 교차 확인했으나, 이는 전환(결과)수 기준이며 본 규칙의 노출수 500회와 지표 단위가 달라 직접 근거로 전용할 수 없음. 업종·채널별 재보정 필요, confidence 낮게 유지",
      "confidence": "low",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-min-observation-period",
      "when": "관찰 기간이 14일 미만인 소재에 요일 패턴을 포함한 결론을 자동 산출",
      "metric": "observation_days",
      "condition": "< 14",
      "action": "요일 패턴 관련 결론 제외, 기간 부족 라벨 부여",
      "guardrail": "Google Ads Experiments 공식 도움말 기준(결과 미확정 시 2~3주 권장, 그래도 불확실하면 4~6주 권장) 중 하한값 14일을 최소 기준으로 채택 — 기존 설계값 7일보다 상향(2026-08-23 Chrome 수집·확인)[answer/6318747, answer/10682377]. 단, Google 수치는 캠페인 단위 트래픽 분할 실험(다른 방법론) 기준이라 소재 단일 비교에 완전히 동일 적용되지는 않는 교차 채널 참고치이며, 통계적 유의성 판정의 숫자 임계치(전환수 등) 자체는 Google도 공개하지 않음(실험 UI가 자동 계산)",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-missing-field-rate",
      "when": "노출·클릭·비용·전환 중 분석에 쓰는 필드의 결측률이 5% 초과",
      "metric": "missing_field_rate",
      "condition": "> 0.05",
      "action": "해당 구간 분석 제외, 결측 원인(API 오류/미연동/삭제) 기록",
      "guardrail": "설계값(제안) — 공식·업계 근거 없음(2026-08-23 조사). 임계치는 파이프라인 안정화 후 재조정",
      "confidence": "low",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-cross-channel-date-boundary",
      "when": "2개 이상 채널 데이터를 조인한 분석에서 정규화 타임존·날짜 경계가 채널 간 불일치",
      "metric": "cross_channel_tz_mismatch_count",
      "condition": "> 0",
      "action": "조인 결과 신뢰도 하향(confidence -1단계), 불일치 채널쌍 로그",
      "guardrail": "불일치 해소 전 크로스채널 결론을 세팅 단계로 전달 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-reproducibility-check",
      "when": "동일 input_hash·동일 확정성 창 조건에서 재실행한 분석 결론(등급·순위)이 이전 실행과 다름",
      "metric": "conclusion_diff_on_rerun",
      "condition": "== true",
      "action": "분석기 비결정성 의심으로 결과 보류, 재실행 로그 첨부해 알림",
      "guardrail": "모델/분석기 버전이 바뀐 경우는 예외 처리(버전 변경 로그로 구분)",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-data-freshness-audit",
      "section": "verify",
      "id": "verify-analyze-common-audit-log-completeness",
      "when": "분석 실행 기록에 input_hash·실행시각(KST)·확정성 창·결론·분석기 버전 중 1개 이상 누락",
      "metric": "audit_log_missing_field_count",
      "condition": "> 0",
      "action": "해당 실행 결과를 승인 대기·세팅 전달 대상에서 제외",
      "guardrail": "감사 로그 스키마 자체는 내부 표준(설계값)이나, 최소 보존기간 3년은 「전자상거래 등에서의 소비자보호에 관한 법률 시행령」 제6조(소비자의 불만 또는 분쟁처리에 관한 기록 3년 보존)를 유사 규정으로 준용한 값이다. 분석 감사로그가 이 조문의 직접 규율 대상은 아니므로 강제력은 없지만, 동일 사업 영역의 법정 최소 보존기간과 일치시켜 하한선으로 채택",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-unfair-ad-claim-types",
      "when": "소재 문구에 거짓·과장, 기만적, 부당 비교, 비방적 표시·광고 패턴(표시광고법 제3조①) 탐지",
      "metric": "unfair_claim_pattern_hits",
      "condition": ">= 1",
      "action": "'정책 위반 의심' 등급 부여, 세팅 단계 전달 차단",
      "guardrail": "자동화는 의심까지만 판단, 최종 위반 여부는 사람이 확정",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-substantiation-missing",
      "when": "가격·할인율·효능 등 사실 주장 포함 소재에 실증자료(가격표·인증서·시험성적서)가 연결돼 있지 않음",
      "metric": "factual_claim_count, substantiation_doc_count",
      "condition": "factual_claim_count >= 1 AND substantiation_doc_count == 0",
      "action": "게재 보류, 실증자료 첨부 요청 알림",
      "guardrail": "공정위 요청 시 15일 이내 제출 의무(제5조③) 기준으로 보류 사유 기록",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-suspension-order-condition",
      "when": "위반 명백 의심 신호와 회복 곤란한 손해 우려 신호(제8조① 2요건)가 동시에 탐지",
      "metric": "clear_violation_signal, irreparable_harm_signal",
      "condition": "clear_violation_signal == true AND irreparable_harm_signal == true",
      "action": "킬스위치 후보 표시, 초긴급 알림 발송(자동 정지는 승인 게이트 통과 후)",
      "guardrail": "사람 승인 없는 자동 정지 금지, 알림 후 최대 대응시간 목표 30분(설계값 — 표시광고법 제8조는 정지명령 발동 요건만 정하고 대응시간을 정하지 않으며, 이번 조사(2026-08-23)에서도 공식·업계 근거를 확보하지 못함, 설계값 유지)",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-cookie-notice-missing",
      "when": "소재·랜딩이 리타게팅 픽셀·쿠키를 사용하는데 연결된 처리방침에 자동수집장치 설치·운영·거부방법(제30조①7호) 고지가 없음",
      "metric": "tracking_pixel_present, privacy_policy_autocollect_notice_present",
      "condition": "tracking_pixel_present == true AND privacy_policy_autocollect_notice_present == false",
      "action": "세팅 단계 전달 차단, 처리방침 보완 요청",
      "guardrail": "고지 보완 확인 전 재검사 없이 자동 해제 금지",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-automated-decision-disclosure",
      "when": "분석 결과가 사람 개입 없이 소재 승인/거부·입찰 자동조정 등 중대한 결정에 직결되는데 거부권·설명요구 대응 절차가 미등록",
      "metric": "auto_decision_impact_level, opt_out_procedure_registered",
      "condition": "auto_decision_impact_level == 'high' AND opt_out_procedure_registered == false",
      "action": "해당 자동 결정 경로 비활성화, 인적 재처리 경로로 전환",
      "guardrail": "제37조의2 대응 절차(거부·설명요구 접수 채널) 등록 전 완전자동 결정 금지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-budget-overdelivery-range",
      "when": "일일 지출이 평균 일예산 2배 이내 또는 월 누적이 30.4배 이내인 정상 변동을 이상으로 오탐",
      "metric": "daily_spend_ratio, monthly_cumulative_ratio",
      "condition": "daily_spend_ratio <= 2.0 AND monthly_cumulative_ratio <= 30.4",
      "action": "이상 알림 억제, 정상 변동으로 로그만 기록",
      "guardrail": "구글 공식 오버딜리버리 범위를 공통 허용치로 준용, 채널별 실측치 확보 시 개별 보정",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-budget-overdelivery-breach",
      "when": "일일 지출이 평균 일예산의 2배를 초과하거나 월 누적이 30.4배를 초과",
      "metric": "daily_spend_ratio, monthly_cumulative_ratio",
      "condition": "daily_spend_ratio > 2.0 OR monthly_cumulative_ratio > 30.4",
      "action": "예산 이상 알림, 원인(중복 캠페인·설정 오류) 조사 후 승인 게이트 등록",
      "guardrail": "초과 확인 시 신규 세팅 전달을 일시 중단",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-human-approval-queue",
      "when": "정책 위반 의심·실증자료 미비·개인정보 고지 누락·예산 이상 중 1개 이상 플래그",
      "metric": "blocking_flags",
      "condition": ">= 1",
      "action": "자동 세팅 전달 차단, 승인 대기열 등록",
      "guardrail": "승인자 식별자·시각·판단 근거가 감사 로그에 기록돼야 해제 가능",
      "confidence": "high",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-pii-exposure-in-creative",
      "when": "소재에 전화번호·주소·특정인 사진 등 개인 식별정보가 노출",
      "metric": "pii_pattern_hits",
      "condition": ">= 1",
      "action": "즉시 보류 등급 부여, 담당자 알림",
      "guardrail": "고의·중과실 유출 시 손해액 5배 배상 리스크(제39조③) 근거로 보류 우선 원칙 적용",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-analyze-common-policy-budget-governance",
      "section": "verify",
      "id": "verify-analyze-common-breach-notification-readiness",
      "when": "분석 파이프라인이 다루는 회원·픽셀 매칭 데이터에서 유출 의심 패턴(비정상 대량 조회·반출) 탐지",
      "metric": "anomalous_export_event_count",
      "condition": ">= 1",
      "action": "지체 없이 담당자 통지, 유출 여부 확인 절차 개시",
      "guardrail": "개인정보 보호법 제34조 원문은 \"지체 없이 알려야 한다\"로만 규정하며 구체적 시간(일수)을 법정하지 않음을 2026-08-23 조문 재확인함(법제처 오픈API, MST 270351). 따라서 내부 대응시간 목표치는 설계값이며, 통지 자체는 법정 의무(강제력 high)이되 목표 분·시간 수치는 confidence medium 유지",
      "confidence": "medium",
      "stage": "analyze",
      "channel": "common"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-ad-required-fields",
      "when": "TEXT_45/RSA_AD 소재 생성 응답 또는 재조회에서 필수 필드 누락·URL 불일치·중복/불허 오류(3822/3827/3819/3820) 발생",
      "metric": "ad_validation_error_count",
      "condition": "> 0 OR statusReason == 'AD_NOT_ENOUGH_ASSETS'",
      "action": "해당 소재 DELETE 후 수정안 생성하여 인간 승인 큐로 이동",
      "guardrail": "자동 재등록 금지, 동일 문안 재전송 금지(3822)",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-inspect-denied-loop",
      "when": "소재/키워드/확장소재/비즈채널 inspectStatus 가 DENIED 또는 statusReason 이 *_DISAPPROVED/KEYWORD_DENIED",
      "metric": "denied_entity_count",
      "condition": "> 0",
      "action": "POST /ncc/inspect-history(≤100건)로 사유 수집 → userLock=true → 사유를 금칙어 사전에 추가 → 수정안 승인 요청",
      "guardrail": "재검수 요청(3402/3823)은 노출제한 상태에서만, 동일 사유 2회 반려 시 자동 수정 중단",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-group-no-approved-asset",
      "when": "광고그룹에 승인 소재 또는 승인 키워드가 0개(에러 4703) 이거나 검수 대기(UNDER_REVIEW)가 24시간 초과",
      "metric": "approved_ad_count_per_group",
      "condition": "== 0 OR under_review_hours > 24",
      "action": "그룹 노출 불가 알림, 24시간 초과 시 검수 지연 에스컬레이션",
      "guardrail": "검수 대기 중 소재 삭제·재등록 금지(검수 큐 리셋 방지)",
      "confidence": "medium",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-adextension-integrity",
      "when": "확장소재 ownerId 불일치(4007)·usePeriod 미설정(4010)·기간 무효(4011)·내부 중복(4009)·내용 무효(4014) 또는 API 생성 불가 유형 전송",
      "metric": "adextension_error_count",
      "condition": "> 0",
      "action": "오류 확장소재 제외 후 나머지 재전송, 생성 불가 유형은 계획에서 제거 알림",
      "guardrail": "확장소재 오류로 상위 소재/그룹 롤백하지 않음",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-extension-image-spec",
      "when": "POWER_LINK_IMAGE/IMAGE_SUB_LINKS 이미지가 Base64 JPEG/PNG 5MB 이하·214x214·헤더 형식 불일치, 또는 이미지 서브링크 배열 3개 초과",
      "metric": "extension_image_spec_valid",
      "condition": "== false",
      "action": "전송 전 차단, 리사이즈/재인코딩 후 재시도",
      "guardrail": "자동 리사이즈는 비율 왜곡 시 중단하고 알림",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-bizchannel-status",
      "when": "그룹의 pcChannelId/mobileChannelId 채널 검수 상태가 미승인이거나 statusReason 이 BUSINESS_CHANNEL_* (PAUSED/DISAPPROVED/UNDER_REVIEW/ABNORMAL_INTERLOCK)",
      "metric": "bizchannel_approved",
      "condition": "== false",
      "action": "그룹 userLock=true 유지, 채널 승인 후 자동 해제 예약, 반려 시 알림",
      "guardrail": "채널 유형이 캠페인 유형과 불일치(3725)하면 그룹 삭제 롤백",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-tracking-mode",
      "when": "프리미엄 로그분석 연동 계획인 캠페인의 trackingMode 가 TRACKING_DISABLED(기본값) 이거나 PASS_THROUGH_SITE_MODE 인데 trackingUrl 누락",
      "metric": "tracking_mode_match",
      "condition": "== false",
      "action": "PUT /ncc/campaigns/{id}?fields=trackingMode 로 계획값 반영 후 재조회",
      "guardrail": "전환 스크립트 미설치 사이트면 AUTO_TRACKING_MODE 강제 대신 알림",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-http-429-backoff",
      "when": "API 응답 HTTP 429 또는 에러 1016(too many connections)",
      "metric": "rate_limit_response_count",
      "condition": ">= 1",
      "action": "지수 백오프(1s→2s→4s…, 최대 5회) 재시도, 동시 요청 수 50% 축소",
      "guardrail": "5회 실패 시 배치 중단·알림, 재시도는 멱등 요청(GET/PUT)만 자동, POST 생성은 중복 생성 방지 위해 재조회 후 재시도",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-auth-failure-halt",
      "when": "HTTP 403 invalid-timestamp, 권한 오류(1018/1006), 또는 비밀키 변경으로 인한 인증 실패",
      "metric": "auth_error_code",
      "condition": "IN [403, 1018, 1006]",
      "action": "invalid-timestamp 는 NTP 동기화 후 1회 재시도, 그 외 즉시 중단하고 API 키 재확인/재발급 알림",
      "guardrail": "인증 오류 상태에서 자동 재시도 2회 이상 금지, 비밀키는 환경변수/시크릿 매니저에서만 교체",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-partial-failure-rollback",
      "when": "세팅 트랜잭션(캠페인→그룹→키워드→소재→확장소재) 중 일부 단계 실패",
      "metric": "setup_transaction_success",
      "condition": "== false",
      "action": "생성 ID 목록 기준 역순 DELETE(확장소재→소재→키워드→그룹), 캠페인은 userLock=true 후 승인 대기",
      "guardrail": "캠페인 DELETE 는 하위 전체 삭제이므로 인간 승인 없이 금지, 롤백 전후 상태를 로그로 보존",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-human-approval-gate",
      "when": "세팅 결과가 승인 게이트 조건(하루예산 합계 > 월예산/30 × 1.2, 신규 비즈채널, 동일 소재 2회 반려, 캠페인 단위 롤백) 중 하나 충족",
      "metric": "approval_gate_triggered",
      "condition": "== true",
      "action": "전 엔티티 userLock=true 상태로 승인 큐 등록, 승인 후 일괄 userLock=false",
      "guardrail": "승인 없이 24시간 경과 시 자동 해제 금지(만료 알림만)",
      "confidence": "medium",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-creative-tracking-api",
      "section": "verify",
      "id": "verify-setup-naver-qi-not-a-signal",
      "when": "검증 로직이 파워링크 키워드 nccQi 값을 품질 판단 기준으로 사용",
      "metric": "uses_powerlink_qi",
      "condition": "== true",
      "action": "nccQi 기반 규칙 비활성화, adRelevanceScore/expectedClickScore 로 대체",
      "guardrail": "2026-07-29 이후 파워링크 nccQi 는 고정값 4(시스템 기본값), 쇼핑 소재 nccQi(1~7)는 유지",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-readback-diff",
      "when": "자동 세팅 완료 직후 생성 엔티티(캠페인/그룹/키워드/소재) GET 재조회",
      "metric": "readback_field_diff_count",
      "condition": "> 0",
      "condition_detail": "planned_json != fetched_json (비교 제외: regTm, editTm, status, statusReason)",
      "action": "차이 필드를 PUT ...?fields= 로 부분 수정 후 재조회, 2회 실패 시 알림",
      "guardrail": "자동 수정은 예산·입찰·userLock·타겟 필드만, 유형/채널 필드는 수정 금지(삭제 롤백 경로)",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-daily-budget-consistency",
      "when": "캠페인 useDailyBudget=true 인데 dailyBudget=0(기본값) 이거나 그룹 예산이 70~1,000,000,000 범위 밖",
      "metric": "daily_budget_value",
      "condition": "useDailyBudget == true AND (dailyBudget <= 0 OR dailyBudget < 70 OR dailyBudget > 1000000000)",
      "action": "계획 예산으로 PUT 수정, 계획값 없으면 캠페인 userLock=true 로 즉시 중지 후 알림",
      "guardrail": "예산 0 상태로 노출 허용 금지, 자동 수정 상한은 계획 예산의 100%",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-group-budget-exceeds-campaign",
      "when": "캠페인 하위 그룹 dailyBudget 합계가 캠페인 dailyBudget 을 초과",
      "metric": "sum_group_budget_over_campaign_ratio",
      "condition": "> 1.0",
      "action": "경고 알림 및 그룹 예산 비율 재배분 제안(자동 수정 없음)",
      "guardrail": "공유예산(sharedBudgetId) 사용 캠페인은 검사 제외",
      "confidence": "medium",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-bid-range",
      "when": "그룹/키워드/콘텐츠네트워크 입찰가가 70~100,000원 범위 밖이거나 useGroupBidAmt=false 인데 bidAmt 누락",
      "metric": "bid_amt",
      "condition": "< 70 OR > 100000 OR (useGroupBidAmt == false AND bidAmt == null)",
      "action": "70 미만→70, 100,000 초과→계획 상한으로 보정 후 재조회, 누락→useGroupBidAmt=true 로 전환",
      "guardrail": "보정 후 입찰가가 계획 대비 ±50% 벗어나면 인간 승인 요청",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-bid-weight-range",
      "when": "pc/mobile/contents NetworkBidWeight 가 10~500 밖이거나 타겟팅 bidWeight 가 50~500 밖",
      "metric": "bid_weight",
      "condition": "network_weight NOT IN [10,500] OR criterion_weight NOT IN [50,500]",
      "action": "경계값으로 클램프 후 PUT, 변경 내역 로그",
      "guardrail": "가중치 자동 변경은 1회, 재위반 시 알림",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-type-channel-mapping",
      "when": "캠페인 유형·그룹 유형·비즈채널 유형 조합이 FAQ 매핑표(WEB_SITE→WEB_SITE→SITE, SHOPPING→SHOPPING/CATALOG/SHOPPING_BRAND→MALL/CATALOG/BRAND_STORE 등)와 불일치",
      "metric": "type_mapping_valid",
      "condition": "== false OR api_error_code IN [3725, 3827, 3923]",
      "action": "해당 그룹·하위 엔티티 DELETE 롤백 후 계획 수정 요청(인간 승인)",
      "guardrail": "캠페인 전체 삭제는 금지, 그룹 단위 롤백만 허용",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-target-validity",
      "when": "타겟팅 유형이 캠페인 유형에서 불허(예: 쇼핑 캠페인의 REGIONAL_TARGET) 이거나 TIME_WEEKLY_TARGET 모든 요일값이 0, 또는 PC_MOBILE/MEDIA 타겟이 계획과 불일치",
      "metric": "target_config_valid",
      "condition": "== false OR statusReason == 'GROUP_PAUSED_BY_INVALID_TARGET'",
      "action": "불허 타겟 삭제, 0 비트마스크는 계획값으로 PUT, 기기/매체 불일치는 알림 후 승인 대기",
      "guardrail": "요일/시간 값 범위 0~16777215 외 값 전송 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-period-kst-midnight",
      "when": "usePeriod=true 인 캠페인/확장소재의 periodStartDt·periodEndDt 가 KST 자정(UTC 15:00:00.000Z) 형식이 아니거나 시작>종료, 종료<오늘",
      "metric": "period_field_valid",
      "condition": "== false OR http_status == 400",
      "action": "KST 자정 형식으로 변환 후 재전송, 날짜 논리 오류는 usePeriod=false 로 두고 알림",
      "guardrail": "종료일 지난 캠페인을 usePeriod=false 로 바꿔 노출 재개시키지 않도록 userLock=true 유지",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-keyword-batch-errors",
      "when": "키워드 생성 배치(1회 ≤100개) 응답에 중복(3905/3907/3908)·금지(3909)·문자(3906)·길이(3913)·한도(3910/3911/3912) 오류 포함",
      "metric": "keyword_batch_error_count",
      "condition": "> 0",
      "action": "오류 키워드를 격리 목록으로 이동, 한도 초과(3910~3912) 시 배치 중단 및 알림",
      "guardrail": "동일 키워드 재시도 금지, 배치 크기 100 초과 전송 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-negative-keyword-conflict",
      "when": "그룹의 노출제한 키워드(restricted-keywords 또는 RESTRICT_KEYWORD_TARGET)가 같은 그룹의 등록 키워드와 동일/포함 관계",
      "metric": "negative_positive_overlap_count",
      "condition": "> 0",
      "action": "충돌 노출제한 키워드 DELETE 후 알림",
      "guardrail": "웹사이트 캠페인 외 그룹에 restricted-keywords 호출 금지(3728), 그룹당 한도 초과(3716) 시 중단",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-default-flag-drift",
      "when": "미지정 시 기본값이 채워지는 플래그(aiAdsOptIn 기본 true, useExpSearch, expSearchBudgetRatio 기본 100, deliveryMethod 기본 ACCELERATED, trackingMode 기본 TRACKING_DISABLED)가 계획과 다름",
      "metric": "default_flag_drift_count",
      "condition": "> 0",
      "action": "계획값으로 PUT 수정, 계획에 값이 없으면 광고주 승인 전까지 userLock=true",
      "guardrail": "aiAdsOptIn 은 파워링크+확장검색 그룹에서만 수정 시도",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-autobid-strategy-valid",
      "when": "쇼핑 상품형 그룹 autobidStrategy 가 허용 조합(autobidBidGoal NONE|MAX_CONV_VALUE, CPC, NO_CAP, value 0) 밖이거나 systemBiddingType=MAXCONV 전송",
      "metric": "autobid_config_valid",
      "condition": "== false",
      "action": "허용 조합으로 보정, MAXCONV 는 제거 후 재전송",
      "guardrail": "전환 로그 미수집 그룹에는 MAX_CONV_VALUE 설정 금지(알림만)",
      "confidence": "high",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-naver-structure-budget-bid",
      "section": "verify",
      "id": "verify-setup-naver-naming-convention",
      "when": "캠페인/그룹 이름이 내부 네이밍 정규식과 불일치하거나 동일 이름 오류(3506/2023), 불허 문자 오류(3712) 발생",
      "metric": "naming_rule_violation_count",
      "condition": "> 0",
      "action": "규칙에 맞게 rename PUT, 중복 이름은 접미사(_02) 부여",
      "guardrail": "이미 노출 중인 엔티티 이름 변경은 로그 남기고 1회만",
      "confidence": "medium",
      "stage": "setup",
      "channel": "naver"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-bid-range-product",
      "when": "상품광고(수동성과형 등) 키워드/상품 입찰가 제안값 산출",
      "metric": "bid_amt",
      "condition": "< 100 OR > 100000 OR (bid_amt MOD 10 != 0)",
      "action": "100원 미만→100원, 10만원 초과→100,000원으로 클램프, 10원 단위 아니면 반올림 후 제안 상태로만 저장",
      "guardrail": "공식 API 없음 — 프로그램은 광고센터에 절대 자동 입력하지 않고 제안 목록만 생성",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-bid-range-brand-cpm",
      "when": "브랜드광고 CPM 입찰가 제안값 산출",
      "metric": "cpm_bid_amt",
      "condition": "< 5000 OR (cpm_bid_amt MOD 10 != 0)",
      "action": "5,000원 미만→5,000원으로 보정, 10원 단위 아니면 반올림",
      "guardrail": "브랜드광고 최소입찰가는 상품광고와 다름 — 유형 오인 시 제안 자체를 차단",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-daily-budget-range",
      "when": "캠페인 일예산(dailyBudget) 제안값 산출",
      "metric": "daily_budget",
      "condition": "< 10000 OR > 1000000000",
      "action": "10,000원 미만→10,000원, 10억 초과→10억으로 클램프 후 재제안",
      "guardrail": "클램프된 제안은 원 계획값과 다름을 라벨링해 사람 승인 단계에서 노출",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-optimization-budget-floor",
      "when": "매출최적화 광고 캠페인 일예산이 30,000원 미만으로 제안",
      "metric": "daily_budget",
      "condition": "< 30000",
      "action": "경고 라벨과 함께 30,000원 이상으로 상향 제안(강제 차단 아님)",
      "guardrail": "공식 문구는 '권장'이며 하드 리밋이 아니므로 사용자가 명시적으로 낮은 예산을 원하면 허용",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-campaign-product-cap",
      "when": "캠페인 1개에 등록 제안된 상품 수 집계",
      "metric": "product_count_per_campaign",
      "condition": "> 500",
      "action": "500개 초과분을 신규 캠페인으로 분할 제안",
      "guardrail": "분할 시 예산은 원 계획 비율대로 배분, 임의 병합 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-keyword-relevance-prefilter",
      "when": "신규 키워드 입찰 등록 후보 목록 생성",
      "metric": "keyword_relevance_score",
      "condition": "< threshold(설계값)",
      "action": "저연관 키워드는 자동 등록 제안에서 제외하고 별도 검토 큐로 이동",
      "guardrail": "공식 FAQ(2026-08-23 재확인): '상품과 연관성이 없는 키워드에는 광고 노출이 제한됩니다', 수동 키워드 검수 소요시간은 평균 2영업일 이내 — 판정 자체는 공식 정책이나 스코어링 알고리즘·임계치는 비공개(고정 수치 없음), 사전 필터 threshold는 설계값(제안) 유지",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-readback-report-diff",
      "when": "사람이 광고센터에서 제안을 수동 실행한 다음 영업일",
      "metric": "proposed_vs_actual_field_diff_count",
      "condition": "> 0",
      "action": "불일치 필드(캠페인명/예산/입찰가)를 미실행·오실행으로 표시하고 재실행 큐에 등록, 3회 연속 불일치면 자동 재제안 중단 후 알림",
      "guardrail": "공식 API 부재로 실행 확인 수단이 리포트 대조뿐 — 최소 1영업일 대기 후 대조",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-report-metric-recompute",
      "when": "엑셀 리포트 파싱 후 클릭률·CPC 재계산",
      "metric": "recomputed_vs_reported_diff_pct",
      "condition": "> 1",
      "action": "오차 1%p 초과 시 해당 리포트 행을 파싱 오류로 격리, 원본 재다운로드",
      "guardrail": "클릭률=클릭수÷노출수×100, CPC=집행광고비÷클릭수 정의를 하드코딩하고 정의 변경 공지를 감시",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-conversion-window-guardrail",
      "when": "신규 캠페인/키워드 세팅 완료 후 첫 성과 판단",
      "metric": "days_since_launch",
      "condition": "< 14",
      "action": "14일 미만 데이터로 자동 축소·중단 액션을 제안하지 않고 '관찰중' 상태 유지",
      "guardrail": "광고 전환 판매수·주문수는 클릭 후 14일 귀속 윈도우 — 조기 판단 시 미도달 전환을 적자로 오판",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-bid-budget-structure",
      "section": "verify",
      "id": "verify-setup-coupang-brand-creative-review-sla",
      "when": "브랜드존 배너/동영상 소재 심사 요청 제안 후 경과일 확인",
      "metric": "review_pending_business_days",
      "condition": "> 2",
      "action": "2영업일 초과 시 상태 조회 알림, 반려 시 사유를 파싱해 재작업 큐로 이동",
      "guardrail": "심사 결과가 나오기 전에는 소재를 '게재중'으로 표시하지 않는다",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-prohibited-category-block",
      "when": "금지 카테고리(성인용품/담배·전자담배/주류·전통주/호신용품/무기류/마약류/의약품) 상품에 대한 캠페인 생성 제안",
      "metric": "category_in_prohibited_list",
      "condition": "== true",
      "action": "캠페인 생성 제안 자체를 차단, 광고주에게 카테고리 재확인 요청",
      "guardrail": "예외 없음 — 사람 승인으로도 우회 불가한 하드 블록",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-creative-copy-prescreen",
      "when": "자동 생성/추천된 광고 문구·이미지 설명에 정책 금칙 표현(선정적/폭력·공포/욕설·비속어/허위 사실화/과장) 포함",
      "metric": "creative_policy_violation_flag",
      "condition": "== true",
      "action": "해당 소재 제안 보류, 대체 문구 재생성 요청",
      "guardrail": "사전 필터는 최소 기준이며 최종 승인은 쿠팡 자체 심사가 별도로 있음을 UI에 고지",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-trademark-keyword-block",
      "when": "자동 키워드 추천에 제3자 등록상표와 동일·유사한 키워드 포함",
      "metric": "trademark_keyword_flag",
      "condition": "== true",
      "action": "해당 키워드를 자동 추천 목록에서 제외",
      "guardrail": "자사 상표·정식 리셀러 계약 보유 시에만 사람이 화이트리스트 예외 등록",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-delivery-condition-keyword-block",
      "when": "자동 키워드 추천에 배송조건 관련 키워드(무료배송/당일배송 등) 포함",
      "metric": "delivery_condition_keyword_flag",
      "condition": "== true",
      "action": "해당 키워드를 추천 목록에서 제외",
      "guardrail": "실제 배송조건과 일치해도 등록 제한 대상이므로 예외 없음",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-fraud-click-spike-hold",
      "when": "최근 리포트 클릭수가 직전 7일 평균 대비 급증(설계값 300% 이상)했는데 전환은 정체",
      "metric": "click_spike_ratio",
      "condition": "> 3.0 AND conversion_delta_pct < 10",
      "action": "해당 캠페인 예산 증액 제안 보류, 부정클릭 의심으로 격리 후 리포트 재확인",
      "guardrail": "faq 원문(2026-08-23 재확인) '부정 클릭 탐지 시스템을 상시 운영하여, 비정상적인 클릭은 무효 클릭으로 처리' + 이용약관 제8조5항 — 탐지 체계는 공식 정책이나 '급증' 판정 배율(300%)은 비공개(고정 수치 없음), 설계값 유지. 프로그램은 증액 억제만 하고 계정 조치는 하지 않음",
      "confidence": "medium",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-no-autonomous-execution",
      "when": "모든 세팅 액션(생성/수정/삭제)의 실행 단계",
      "metric": "execution_mode",
      "condition": "!= 'human_manual'",
      "action": "자동 실행 시도 자체를 무조건 차단하고 '제안' 상태로만 저장",
      "guardrail": "공식 API 부재 — 매크로/RPA로 광고센터 화면을 대신 조작하는 것도 금지, 사람이 직접 클릭해 실행",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-partial-execution-quarantine",
      "when": "사람이 제안 목록 중 일부만 실행하고 나머지는 미실행·거부",
      "metric": "partial_execution_detected",
      "condition": "== true",
      "action": "미실행 항목을 별도 대기열로 격리, 실행 항목만 read-back 대조 진행",
      "guardrail": "미실행 항목을 실행완료로 간주해 자가검증 단계로 넘기지 않는다",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-account-risk-signal-halt",
      "when": "약관 위반 징후(광고 재판매·양도, 이용료 미납, 제3자 권리침해 분쟁) 감지",
      "metric": "account_risk_signal",
      "condition": "== true",
      "action": "해당 계정의 모든 자동 세팅 제안 생성 중단, 담당자 알림",
      "guardrail": "계정 정지·해지는 쿠팡 단독 판단 — 프로그램은 예방적 중단만 수행, 이의제기는 사람이 진행",
      "confidence": "high",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-coupang-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-coupang-rejected-creative-resubmit-lock",
      "when": "동일 소재(이미지 해시/문구 동일)가 동일 사유로 이전에 심사 반려된 이력 존재",
      "metric": "duplicate_rejection_count",
      "condition": ">= 1",
      "action": "동일 소재 재제출 제안을 차단, 반려 사유가 해소된 수정본만 재제안 허용",
      "guardrail": "policy/, Faq.html, faq, designguide 전부 반려 이력 보관·재심사 정책 문구 없음(공식·업계 근거 없음, 2026-08-23 조사) — 설계값(90일 보관 가정) 유지, 사유 미해소 반복 재제출 시 신뢰도 점수 하향",
      "confidence": "low",
      "stage": "setup",
      "channel": "coupang"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-ad-review-pending-block",
      "when": "생성한 광고의 effective_status가 PENDING_REVIEW 또는 IN_PROCESS",
      "metric": "ad_review_state",
      "condition": "IN ['PENDING_REVIEW', 'IN_PROCESS']",
      "action": "심사 완료까지 예산 증액·추가 소재 등록 등 후속 세팅 보류, 24시간 초과 시 알림",
      "guardrail": "심사 중 상태를 강제로 ACTIVE 전환 시도 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-ad-disapproved-quarantine",
      "when": "광고 effective_status == DISAPPROVED",
      "metric": "ad_effective_status",
      "condition": "== 'DISAPPROVED'",
      "action": "광고를 PAUSED로 전환하고 격리 목록에 이동, 반려 사유 로그 저장",
      "guardrail": "격리 상태에서 동일 소재 자동 재제출 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-repeat-rejection-escalate",
      "when": "동일 소재(카피/이미지 해시 동일)가 반려 후 실질적 수정 없이 재제출 시도",
      "metric": "resubmit_without_change_count",
      "condition": ">= 2",
      "action": "3회째부터 자동 재제출 차단, 사람에게 에스컬레이션",
      "guardrail": "실질적 수정 판정은 카피 diff 또는 이미지 해시 변경 여부로만 판단",
      "confidence": "medium",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-policy-prescreen",
      "when": "세팅 대상 카피·대체텍스트가 Ad Standards 6대 분류(불법/사기/제한상품/objectionable/IP/사회이슈정치) 키워드·패턴과 매칭",
      "metric": "policy_pattern_match_count",
      "condition": "> 0",
      "action": "정책 의심 라벨 부여, 사람 확인 전 게시 보류",
      "guardrail": "자동화는 최종 정책 판단을 내리지 않는다(차단이 아니라 보류)",
      "confidence": "medium",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-personal-attribute-assertion",
      "when": "카피에 인종/민족/종교/나이/성적지향/장애/건강상태 등 개인 속성을 단정·암시하는 2인칭 표현 존재",
      "metric": "personal_attribute_pattern_count",
      "condition": "> 0",
      "action": "세팅 차단(경고 아님), 재작성 요청",
      "guardrail": "이 항목은 정책 의심 라벨보다 강한 하드 차단으로 처리",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-political-authorization-missing",
      "when": "special_ad_categories == ISSUES_ELECTIONS_POLITICS 인데 광고주 인증 완료 여부 또는 고지 문구가 계획에 없음",
      "metric": "political_auth_and_disclaimer_present",
      "condition": "== false",
      "action": "세팅 차단, 인증·고지 완료 전까지 게시 금지",
      "guardrail": "인증 우회를 위한 카테고리 미지정 시도 자체를 special-category-required 규칙으로 별도 차단",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-creative-text-soft-limit",
      "when": "기본 텍스트(primary text) 길이가 공식 권장치 90자를 초과하거나 헤드라인 길이가 25자를 초과(Marketing API AdCreative 레퍼런스 필드 수준 제한, 2026-08-23 원문 확인)",
      "metric": "primary_text_length_or_headline_length",
      "condition": "primary_text_length > 90 OR headline_length > 25",
      "action": "잘림 미리보기 첨부해 경고만 표시, 세팅 차단하지 않음",
      "guardrail": "공식 문서가 '권장(recommended)'으로 표기해 하드 리밋 여부가 명확히 규정되지 않았으므로 자동 절삭·차단 금지, 실제 API 응답(에러/트렁케이션 여부)을 관측해 하드 리밋 여부 추가 검증",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-catalog-format-rule-branch",
      "when": "세팅 대상이 카탈로그/다이내믹(Advantage+ 카탈로그) 광고인데 일반 단일 소재용 정책 규칙 세트가 그대로 적용됨",
      "metric": "rule_set_branch_correct",
      "condition": "== false",
      "action": "카탈로그 전용 규칙 세트로 분기(피드 자동 생성 문구는 스크리닝 제외, 제한 업종 카탈로그는 사람 확인 유지)",
      "guardrail": "제한 업종(금융/의료 등) 카탈로그는 분기 후에도 사람 확인 생략 금지",
      "confidence": "medium",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-partial-failure-rollback",
      "when": "캠페인→광고세트→광고 순차 세팅 중 하위 단계 생성 실패",
      "metric": "chain_creation_failed",
      "condition": "== true",
      "action": "이번 트랜잭션에서 신규 생성한 상위 체인(빈 캠페인/광고세트 포함)을 DELETED로 롤백, 재시도는 격리 큐에서 사람 승인 후 진행",
      "guardrail": "트랜잭션 이전부터 존재하던 기존 엔티티는 롤백·삭제 대상에서 제외",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-meta-human-approval-gate",
      "when": "special_ad_categories != NONE, 정책 의심 라벨 부여, 개인 속성 암시 차단 발동, 일 예산이 계정 설계 임계치 초과 중 하나 이상 해당",
      "metric": "human_gate_trigger_count",
      "condition": "> 0",
      "action": "자동 게시 보류, 사람 승인 큐로 전환",
      "guardrail": "승인 큐 대기 항목은 타임아웃으로 자동 승인 처리하지 않음",
      "confidence": "medium",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-special-category-required",
      "when": "캠페인 생성 요청에 special_ad_categories 필드가 없음",
      "metric": "special_ad_categories_present",
      "condition": "== false",
      "action": "세팅 차단, 사람에게 업종 분류 후 명시적 값(NONE 포함) 입력 요청",
      "guardrail": "프로그램이 임의로 NONE을 자동 채움 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-special-category-targeting-violation",
      "when": "special_ad_categories에 HOUSING/EMPLOYMENT/FINANCIAL_PRODUCTS_SERVICES 포함인데 성별 지정·위치 제외·소단위 위치·상세타겟팅·유사타겟 중 하나 이상 존재",
      "metric": "restricted_targeting_field_count",
      "condition": "> 0",
      "action": "위반 필드 제거 제안 후 세팅 보류, 자동 제거는 실행하지 않고 사람 승인 대기",
      "guardrail": "special_ad_category 캠페인은 이 검사를 통과하기 전 게시 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-cbo-abo-budget-conflict",
      "when": "캠페인 daily_budget/lifetime_budget 존재(CBO)인데 하위 광고세트 생성 요청에도 예산 필드 포함, 또는 둘 다 없음",
      "metric": "budget_level_conflict",
      "condition": "== true",
      "action": "CBO면 광고세트 예산 필드 제거 후 재전송, 양쪽 다 없으면 필수값 누락으로 차단",
      "guardrail": "자동 제거는 광고세트 예산 필드에 한정, 캠페인 예산은 임의 변경 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-bid-strategy-amount-mismatch",
      "when": "bid_strategy가 LOWEST_COST_WITH_BID_CAP/COST_CAP인데 bid_amount 누락, 또는 LOWEST_COST_WITHOUT_CAP인데 bid_amount 존재",
      "metric": "bid_strategy_amount_valid",
      "condition": "== false",
      "action": "누락 시 계획값으로 bid_amount 채움, 불필요 시 필드 제거 후 재전송",
      "guardrail": "계획서에 bid_amount 값이 없으면 자동 보정 없이 세팅 보류",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-budget-below-optimization-min",
      "when": "LOWEST_COST_WITHOUT_CAP 기준 daily_budget가 공식 최소치(임프레션류 $0.50/일, 클릭류 $2.50/일, 저빈도 액션류 $40/일; 대한민국 등 2배 적용국은 저빈도 액션 제외 금액이 2배) 미만이거나, LOWEST_COST_WITH_BID_CAP 기준 예산이 임프레션류는 bid_amount 미만, 클릭/액션류는 bid_amount*5 미만",
      "metric": "daily_budget_local",
      "condition": "< min_budget_for_goal(optimization_goal, bid_strategy, bid_amount, account_country_2x_flag)",
      "action": "최소치(대한민국 계정은 저빈도 액션 제외 2배 적용)로 상향 제안, 계획 예산이 최소치 미만이면 세팅 보류하고 사람에게 알림",
      "guardrail": "최소치·2배 배수 자체는 Ad Campaign 레퍼런스 공식 수치(2026-08-23 확인)이나, USD→KRW 환산에 쓰는 환율은 결제 시점 값을 조회해 적용하고 임의 고정 환율 하드코딩 금지, 자동 상향 폭은 산출된 최소치까지만",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-account-resource-limit",
      "when": "계정 비보관 캠페인/광고세트/광고 수가 유형별 상한(표준 6,000/6,000/6,000, 대량 10,000/10,000/50,000)의 90% 이상",
      "metric": "non_archived_entity_ratio",
      "condition": ">= 0.9",
      "action": "신규 생성 차단 경고, 90일 이상 미노출 ARCHIVED 후보 목록 제안",
      "guardrail": "100% 도달 전 신규 캠페인 생성 자체를 중단",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-account-status-halt",
      "when": "account_status != 1(ACTIVE)",
      "metric": "account_status",
      "condition": "!= 1",
      "action": "모든 생성·수정 작업 즉시 중단, disable_reason과 함께 알림",
      "guardrail": "계정 상태 정상화(사람 조치) 전까지 재시도 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-readback-status-diff",
      "when": "생성 직후 재조회한 campaign/adset/ad의 status 또는 effective_status가 계획과 다름",
      "metric": "readback_status_diff_count",
      "condition": "> 0",
      "action": "상위 계층(캠페인→광고세트→광고 순)부터 원인 조회, 필요 시 PUT으로 상태 정정 후 재조회",
      "guardrail": "DISAPPROVED/WITH_ISSUES 상태는 이 규칙이 아니라 정책 검증 문서(verify-setup-meta-ad-disapproved-quarantine)로 위임",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-batch-size-limit",
      "when": "배치 요청 1건에 포함된 오퍼레이션이 50개 초과",
      "metric": "batch_operation_count",
      "condition": "> 50",
      "action": "50개 단위로 분할 후 순차 전송",
      "guardrail": "분할 후에도 개별 실패 항목만 골라 재시도, 성공분 재전송 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-meta-structure-limits",
      "section": "verify",
      "id": "verify-setup-meta-rate-limit-backoff",
      "when": "X-Business-Use-Case-Usage/X-Ad-Account-Usage 헤더의 call_count·total_cputime·total_time 중 하나가 90% 이상, 또는 에러코드 80000/80003/80004 수신",
      "metric": "buc_usage_pct",
      "condition": ">= 90 OR error_code IN [80000, 80003, 80004]",
      "action": "세팅 작업 즉시 중단, estimated_time_to_regain_access만큼 대기 후 재개",
      "guardrail": "대기 중 동일 계정에 대한 추가 호출 금지, 다른 계정 작업으로 전환은 허용",
      "confidence": "high",
      "stage": "setup",
      "channel": "meta"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-restricted-category-gate",
      "when": "생성 계획의 업종·소재가 제한 콘텐츠 범주(주류/도박/헬스케어/금융상품/정치광고 등)로 분류됨",
      "metric": "restricted_category_flag",
      "condition": "== true",
      "action": "자동 뮤테이트 보류, 인증서류·승인 요청을 사람에게 전달",
      "guardrail": "인간 승인 없이 제한 콘텐츠 캠페인/그룹/소재 생성 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-misrepresentation-riskword",
      "when": "자동 생성 헤드라인/설명/이미지에 가격왜곡·과장효능·클릭베이트·조작미디어 패턴 위험어 매칭",
      "metric": "misrepresentation_riskword_count",
      "condition": "> 0",
      "action": "해당 소재 게재 보류, 근거자료 첨부 후 인간 승인으로만 해제, 동일 계정의 다른 자동화 런도 함께 일시정지",
      "guardrail": "위반 확정 시 사전경고 없이 계정정지 가능 — 개별 소재 단위가 아니라 계정 전체 자동화를 정지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-editorial-capitalization-symbol",
      "when": "헤드라인/설명 텍스트에 의도 없는 대문자 남용, 목적 외 기호·구두점, 유효하지 않은 문자 존재",
      "metric": "editorial_violation_count",
      "condition": "> 0",
      "action": "제출 전 반려, 규칙 위반 부분만 표시해 재생성 요청",
      "guardrail": "자동으로 대문자/기호를 임의 변경해 제출하지 않음(원문 의미 훼손 방지)",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-ad-text-phone-number",
      "when": "광고 텍스트(헤드라인/설명)에 전화번호 패턴 포함",
      "metric": "phone_number_in_ad_text_count",
      "condition": "> 0",
      "action": "해당 자산 제출 차단, 착신번호 확장(콜 애셋)으로 대체 제안",
      "guardrail": "예외 없이 광고 텍스트 필드에는 전화번호 삽입 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-nonstandard-repetition",
      "when": "동일 광고그룹/캠페인/계정 내 동일 단어·문구가 비표준적으로 반복(같은 자산 내 반복 포함)",
      "metric": "nonstandard_repetition_count",
      "condition": "> 0",
      "action": "반복 자산에 최소 변형(어순·표현 교체) 적용 후 재검사, 2회 실패 시 사람 검토",
      "guardrail": "동일 텍스트를 다른 그룹에 그대로 복제 재사용 금지",
      "confidence": "medium",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-policy-preflight-gate",
      "when": "소재 뮤테이트가 validate_only=true 프리플라이트 없이 바로 실전 반영 시도되거나, 프리플라이트 응답에 정책 관련 에러 포함",
      "metric": "policy_preflight_error_count",
      "condition": "preflight_skipped == true OR policy_preflight_error_count > 0",
      "action": "실전 뮤테이트 차단, 에러 사유를 계획서에 반영해 재생성 후 재프리플라이트",
      "guardrail": "정책 에러 포함 프리플라이트를 무시하고 강제 진행 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-failure-isolation-not-delete",
      "when": "세팅 중 하위 엔티티(키워드/소재/자산) 생성 실패 또는 정책 위반",
      "metric": "entity_creation_failure_count",
      "condition": "> 0",
      "action": "실패 엔티티만 격리 목록으로 이동, 상위 엔티티(캠페인/그룹)는 유지한 채 재처리 큐에 등록",
      "guardrail": "실패를 이유로 상위 엔티티 전체 삭제 금지, 격리 상태를 감사로그에 기록",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-dependent-op-no-partial-reflect",
      "when": "PMax 자산그룹처럼 의존관계 있는 오퍼레이션 묶음 중 일부만 반영되고 나머지 실패(부분실패 모드 오용)",
      "metric": "dependent_op_partial_reflect_count",
      "condition": "> 0",
      "action": "부분 반영된 상태를 즉시 격리(일시중지)하고 전체 재생성, 이후 요청은 부분실패 미사용으로 재구성",
      "guardrail": "의존 오퍼레이션은 전부-반영 또는 전무-반영만 허용, 중간 상태로 게재 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-policy-creative-rollback",
      "section": "verify",
      "id": "verify-setup-google-repeat-violation-escalation",
      "when": "동일 캠페인/계정에서 정책 위반 프리플라이트 에러가 최근 이력상 반복(예: 동일 세션 3회 이상)",
      "metric": "repeat_policy_violation_count",
      "condition": ">= 3",
      "action": "자동 재시도 중단, 해당 캠페인/계정의 자동 세팅을 인간 승인 경로로 전환",
      "guardrail": "반복 위반 상태에서 자동 재생성-재제출 루프 금지(계정 리스크 누적 방지)",
      "confidence": "medium",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-validate-only-preflight",
      "when": "실제 뮤테이트 전 validate_only=true 프리플라이트를 실행하지 않았거나 프리플라이트 응답에 에러 존재",
      "metric": "preflight_error_count",
      "condition": "preflight_skipped == true OR preflight_error_count > 0",
      "action": "실제 뮤테이트 차단, 에러 필드 목록을 계획서에 반영 후 재생성",
      "guardrail": "정책 위반 에러 포함 시 자동 재시도 금지, 정책 검토 큐로 이관",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-mutate-batch-size",
      "when": "단일 Mutate 요청의 오퍼레이션 수가 10,000 초과 또는 액션 오퍼레이션이 100 초과",
      "metric": "operations_per_request",
      "condition": "> 10000 OR action_operations_per_request > 100",
      "action": "요청을 청크로 분할하거나 BatchJobService 비동기 처리로 전환",
      "guardrail": "동기 Mutate로 상한 초과 전송 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-pmax-atomic-creation",
      "when": "PMax AssetGroup 생성과 필수 최소 AssetGroupAsset 연결이 서로 다른 요청/부분실패 모드로 분리 전송됨",
      "metric": "pmax_atomic_creation_valid",
      "condition": "== false",
      "action": "AssetGroup과 필수 최소 자산 연결 오퍼레이션을 하나의 벌크 뮤테이트(부분실패 미사용)로 재구성",
      "guardrail": "의존관계 있는 오퍼레이션에 partial_failure 사용 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-concurrent-modification-retry",
      "when": "뮤테이트 응답이 DatabaseError.CONCURRENT_MODIFICATION_ERROR",
      "metric": "concurrent_modification_error_count",
      "condition": "> 0",
      "action": "대상 리소스 재조회 후 diff 재계산, 재전송(최대 3회)",
      "guardrail": "3회 초과 실패 시 해당 엔티티 격리, 자동 재시도 중단",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-readback-diff",
      "when": "뮤테이트 성공 직후 resource_name GAQL 재조회 결과가 계획 JSON과 필드 불일치",
      "metric": "readback_field_diff_count",
      "condition": "> 0",
      "action": "차이 필드만 부분 업데이트 후 재조회, 2회 실패 시 알림",
      "guardrail": "구조 필드(유형·채널) 자동 수정 금지, 값 필드(예산·입찰·텍스트)만 자동 보정",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-rsa-asset-count-char",
      "when": "RSA 헤드라인 개수가 3~15 밖이거나 30자 초과, 설명 개수가 2~4 밖이거나 90자 초과, 경로가 15자 초과(2배폭 언어는 글자당 2자 환산)",
      "metric": "rsa_asset_valid",
      "condition": "== false",
      "action": "초과 자산 절삭 또는 부족분 생성 요청으로 반려, 자동 생성 금지(사람 검토)",
      "guardrail": "자동으로 텍스트를 잘라 30/90자에 맞추지 않음(의미 훼손 위험), 개수 부족만 자동 보류",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-pmax-required-assets",
      "when": "PMax 자산그룹의 헤드라인/롱헤드라인/설명/비즈니스명/마케팅이미지/정방형이미지/로고 개수·해상도·비율이 스펙 범위 밖",
      "metric": "pmax_asset_requirement_valid",
      "condition": "== false",
      "action": "부족 자산 유형을 목록화해 생성 큐에 등록, 충족 전까지 해당 자산그룹 게재 보류(PAUSED 상태 유지)",
      "guardrail": "필수 자산 미충족 상태로 ENABLED 전환 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-bidding-strategy-pmax-compatibility",
      "when": "PMax 캠페인에 전환수 최대화/전환가치 최대화 이외의 입찰 전략이 설정됨",
      "metric": "pmax_bidding_strategy_valid",
      "condition": "== false",
      "action": "전환수 최대화(목표 미설정) 또는 전환가치 최대화로 강제 보정, 목표(tROAS/tCPA) 값은 계획값 사용",
      "guardrail": "지원되지 않는 전략 타입으로 뮤테이트 재시도 금지",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-budget-strategy-alignment",
      "when": "포트폴리오 예산-입찰전략 정렬 대상 캠페인 집합이 예산/전략 양쪽에서 서로 다르거나, 정렬 변경이 여러 Mutate 호출로 나뉘어 처리됨",
      "metric": "budget_strategy_alignment_valid",
      "condition": "== false",
      "action": "동일 캠페인 집합으로 재정렬, 정렬 변경을 단일 Mutate 호출로 재구성",
      "guardrail": "이전 정렬에서 떨어져나간(stranded) 캠페인을 그대로 방치 금지, 명시적으로 해제 처리",
      "confidence": "high",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-google-structure-limits-readback",
      "section": "verify",
      "id": "verify-setup-google-rsa-pinning-overuse",
      "when": "RSA 자산그룹에서 핀 고정된 헤드라인/설명 비율이 전체 슬롯의 50%를 초과(설계값, 방향은 공식 권고와 일치)",
      "metric": "pinned_asset_ratio",
      "condition": "> 0.5",
      "action": "필수 고정 문구(브랜드명·법적고지 등) 외 핀 해제 제안, 비고정 자산 회전 여지 확보",
      "guardrail": "공식: 고정 수치(%) 없음(출처: RSA 모범사례 6167122 FAQ 원문 — \"For general ad campaigns, no. Only pin your headlines if you have specific campaign goals that require consistent messaging. Pinned headlines and descriptions limit the combinations of your Responsive search ads.\" 2026-08-23 WebFetch 확인). 즉 구글은 '일반 캠페인은 핀 자체를 쓰지 말라'는 방향만 명시하고 구체적 비율은 제공하지 않음 — 50% 임계값은 설계값(제안)으로 유지하되 방향성은 공식 권고와 일치. 자동으로 핀을 해제하지 않고 제안만 생성(광고 강도 하락 우려)",
      "confidence": "medium",
      "stage": "setup",
      "channel": "google"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-audit-log-fail-closed",
      "when": "자동 세팅 액션 실행 직전 감사 로그 기록 API 호출",
      "metric": "audit_log_write_success",
      "condition": "== false",
      "action": "대상 변경 API 호출을 보내지 않고 재시도 큐로 이동, 알림",
      "guardrail": "로그 없는 변경은 어떤 예외 상황에서도 허용하지 않는다",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-audit-log-schema-required-fields",
      "when": "감사 로그 레코드 생성 시",
      "metric": "missing_required_field_count",
      "condition": "> 0",
      "condition_detail": "필수 필드: actor, entity, before, after, ts_utc, ts_kst, triggered_rule_id",
      "action": "레코드 거부, 원본 액션도 같이 롤백(로그 스키마 위반은 액션 무효)",
      "guardrail": "approval_ref 는 승인 필요 액션에서만 필수",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-timestamp-dual-kst-utc",
      "when": "감사 로그 또는 기간 필드에 시각을 기록",
      "metric": "has_both_ts_utc_and_ts_kst",
      "condition": "== false",
      "action": "UTC 값에서 KST 파생값을 계산해 채워넣고, 누락 원인 로깅",
      "guardrail": "KST만 있고 UTC 없는 레코드는 채널 전송 어댑터가 처리 불가하므로 즉시 보정",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-channel-time-format-adapter",
      "when": "기간/시각 필드를 포함한 요청을 채널 API로 전송하기 직전(예: 네이버 periodStartDt/EndDt)",
      "metric": "channel_time_format_valid",
      "condition": "== false",
      "condition_detail": "네이버는 KST 자정의 UTC 표현(...T15:00:00.000Z)만 허용, 시분초 포함 시 400",
      "action": "전송 전 어댑터로 재변환 후 재검증, 재검증 실패 시 전송 차단",
      "guardrail": "채널별 형식 규칙은 공식 공지 변경 시에만 갱신(임의 추정 금지)",
      "confidence": "high",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-data-freshness-gate",
      "when": "세팅 액션의 판단 근거로 쓰이는 성과 데이터의 last_synced_at 확인",
      "metric": "data_staleness_minutes",
      "condition": "> freshness_threshold_minutes",
      "condition_detail": "채널별 공식 기본값(분): 네이버 ON/OFF·입찰가=수십(예:60), 타겟팅=30, 쇼핑=120(쇼핑 내 반영 최대 1440), 플레이스=180, 파워링크=240, 신규등록/소재검토=2영업일(약 2880~5760); 메타=15(단, 종료후 28일까지 provisional); GA4=4320(72시간)",
      "action": "세팅 액션 보류, 재동기화 큐에 등록 후 재동기화 완료 시 재평가",
      "guardrail": "임계값은 채널 공식 문서(네이버 FAQ 442, Meta Insights best practices, GA4 고객센터)를 기본값으로 사용하고, 표에 없는 채널·액션만 설계값으로 임시 보정 후 문서화",
      "confidence": "high",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-usage-signal-snapshot",
      "when": "쓰기 API 호출 직전 플랫폼이 사용량/상태 헤더를 제공(예: 메타 X-Business-Use-Case-Usage)",
      "metric": "usage_header_snapshot_logged",
      "condition": "== false",
      "action": "헤더 값을 감사 로그에 스냅샷으로 첨부, 누락 시 해당 호출은 경고 플래그와 함께 기록",
      "guardrail": "헤더 미제공 채널(예: 네이버 429는 사전 신호 없음)은 이 규칙 적용 제외",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-ad-copy-precheck-ftc",
      "when": "자동 세팅이 프로모션 카피·가격/할인율 표기·비교 표현(1위, 최저가 등) 필드를 채워 넣기 직전",
      "metric": "deceptive_ad_pattern_match",
      "condition": "== true",
      "condition_detail": "거짓·과장, 기만, 부당비교, 비방 4유형 패턴 사전 필터 기준",
      "action": "자동 발행 보류, 사람 승인 큐로 전달",
      "guardrail": "필터 오탐 가능성이 있으므로 자동 차단이 아닌 승인 대기로만 처리(자동 거부 금지)",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-pii-audience-upload-track",
      "when": "고객 매치·리마케팅 리스트 등 PII를 포함하는 세팅 API 호출",
      "metric": "uses_separate_pii_audit_track",
      "condition": "== false",
      "action": "일반 세팅 로그와 별도 스토리지·접근권한 트랙으로 재기록, 담당 승인 없으면 호출 차단",
      "guardrail": "개인정보 보호법 제21조 원문은 \"보유기간의 경과, 처리 목적 달성 등 개인정보가 불필요하게 되었을 때 지체 없이 파기\"로만 규정하며 구체적 보관 일수를 법정하지 않음을 2026-08-23 조문 재확인(법제처 오픈API, MST 270351). 즉 고정 수치가 없다는 것 자체가 공식 확인 사실이므로, 보관기간·파기 주기는 목적(세팅 근거 추적)에 맞춘 설계값(정기 재확인)을 유지하되 confidence는 '공식: 고정값 없음' 근거로 한 단계 상향",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-audit-log-freshness-compliance",
      "section": "verify",
      "id": "verify-setup-common-change-diff-required-in-log",
      "when": "세팅 변경 액션이 감사 로그에 기록될 때",
      "metric": "before_after_diff_present",
      "condition": "== false",
      "action": "before/after 값을 재조회하여 diff 를 채운 뒤에만 로그 확정, 채우지 못하면 액션 자체를 실패 처리",
      "guardrail": "diff 없는 변경 이력은 감사 목적상 무효로 간주",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-preflight-budget-ceiling",
      "when": "자동 세팅이 예산 변경 요청을 API로 전송하기 전",
      "metric": "requested_budget_delta_ratio",
      "condition": "> planned_budget_ceiling_ratio",
      "action": "API 호출 전 차단, 승인 큐에 사유와 함께 적재",
      "guardrail": "가드레일 수치(planned_budget_ceiling_ratio) 자체 변경은 승인 게이트 대상. 비율값(예: +30%/24시간) 자체는 공식·업계 근거 없음(1라운드 2026-08-23 조사 — 구글 애즈·메타·네이버 공식 문서 모두 '자동화가 24시간 내 늘릴 수 있는 예산 총량 상한'을 규정하지 않으며, WebSearch 예산 소진으로 업계 벤치마크도 확보 실패). 2라운드(2026-08-23, Chrome 수집)에서 Google Ads 'Learning'(입찰전략 학습 상태) 공식 도움말을 직접 확인한 결과, 예산/설정 변경이 재학습을 유발하는지는 '금액의 크기(magnitude)'에만 달려있다고 설명할 뿐 구체적 변경폭(%) 임계치가 없음을 공식적으로 재확인했다[answer/6263057]. 학습기간 자체의 유일한 공식 정량치는 최대 3주 또는 1~2 전환주기다[answer/13020501]. 따라서 비율값은 여전히 설계값이나 '공식 문서에 고정 임계치가 없다'는 사실 자체가 확인되었으므로 confidence를 상향한다. 채널 실측치 확보 시 개별 보정",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-structural-limit-headroom",
      "when": "채널 계정의 캠페인/예산/라벨/피드 등 개수가 공식 문서화된 계정 한도의 80%를 초과",
      "metric": "entity_count_ratio_of_limit",
      "condition": ">= 0.8",
      "action": "경보 발송, 0.9 이상이면 신규 엔티티 생성 API 호출 차단",
      "guardrail": "구조 한도 자체(예: 구글 비공유예산 20,000개)는 채널 공식 문서 기준(확인됨)이나, 80%/90%라는 경보·차단 임계 비율 자체는 공식 근거 없음(2026-08-23 조사 — Google/Meta/Naver 공식 문서에 '용량 임계 경보 비율' 규정 없음, 업계 표준 용량관리 관행으로 흔히 쓰이는 수치이나 이번 조사에서 1차 출처 미확보). 한도 수치는 채널 공식 문서(예: Google system-limits) 기준으로만 갱신, 임의 추정 금지",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-approval-required-actions",
      "when": "신규 캠페인 집행, 예산 가드레일 수치 변경, 입찰 목표 공격적 전환, 대량 삭제 중 하나에 해당",
      "metric": "action_type",
      "condition": "IN [campaign_launch, guardrail_change, aggressive_bid_goal_switch, bulk_delete, killswitch_reset]",
      "action": "자동 실행 금지, 사람 승인 큐 적재 후 승인 로그 연결 시에만 API 호출",
      "guardrail": "승인자 1인 이상, 승인 없는 API 호출 시도는 즉시 실패 처리",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-killswitch-rate-limit-trigger",
      "when": "동일 계정에서 채널 표준화 rate_limit_signal(구글 RESOURCE_TEMPORARILY_EXHAUSTED, 메타 4/17/80001/80004, 네이버 429)이 짧은 시간 내 반복 수신",
      "metric": "rate_limit_signal_count_window",
      "condition": ">= 3 (설계값, 관찰 기간 내)",
      "action": "해당 채널·계정의 쓰기 API만 즉시 차단(킬스위치), 조회 API는 유지",
      "guardrail": "다른 채널·계정은 영향 없음(격리), 차단 사유·시각 로그 필수. 신호(에러코드/헤더) 자체를 킬스위치 트리거로 삼는 메커니즘은 채널 공식 문서 기준(구글/메타 공식, 네이버 429)이나, 반복 횟수 임계값(3회)은 공식·업계 근거 없는 설계값(2026-08-23 조사에서 확보 실패) — 트리거 메커니즘과 횟수 임계값의 confidence를 분리해서 읽을 것",
      "confidence": "high",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-killswitch-meta-buc-backoff",
      "when": "메타 응답 헤더 X-Business-Use-Case-Usage 의 call_count 또는 estimated_time_to_regain_access 가 임계 초과",
      "metric": "buc_call_count_pct",
      "condition": ">= 90",
      "action": "estimated_time_to_regain_access 만큼 쓰기 요청 자동 유예, 유예 중 재시도 금지",
      "guardrail": "문서 권고대로 한도 도달 시 추가 호출 금지(복구시간 연장 방지)",
      "confidence": "high",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-killswitch-spend-anomaly",
      "when": "계정의 최근 1시간 API 기반 예산·입찰 변경 합산액이 직전 N일 평균 대비 이상치",
      "metric": "spend_change_multiple_of_baseline",
      "condition": "> 3x (설계값, 공식 기준 없음)",
      "action": "쓰기 API 차단 및 즉시 알림, 원인이 정상 프로모션 등으로 승인되기 전까지 유지",
      "guardrail": "휴일·프로모션 캘린더 등록 계정은 배수 상한을 사람이 사전 조정 가능(자동 상향 금지). 배수(3x) 자체는 공식·업계 근거 없음(2026-08-23 조사, WebSearch 예산 소진으로 이상탐지 벤치마크 미확보), 설계값 유지",
      "confidence": "low",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-killswitch-unapproved-change",
      "when": "재조회(read-back) 결과가 오케스트레이션 변경 이력에 없는 값으로 확인(수동 개입 등)",
      "metric": "unapproved_diff_detected",
      "condition": "== true",
      "action": "해당 엔티티만 격리(자동 수정 금지), 알림 후 사람 확인 대기",
      "guardrail": "격리 중 다른 정상 엔티티의 자동 세팅은 계속 진행",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-killswitch-manual-reset-only",
      "when": "킬스위치가 발동된 채널·계정의 재개(reset) 요청",
      "metric": "reset_trigger_type",
      "condition": "!= human_approved",
      "action": "자동 재개 거부, 사람 승인 시에만 재개하고 재개 즉시 원인 조건 재검사",
      "guardrail": "동일 원인이 재개 후 즉시 재발하면 재개 자체를 롤백하고 에스컬레이션",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-setup-common-budget-guardrail-approval-killswitch",
      "section": "verify",
      "id": "verify-setup-common-killswitch-scope-isolation",
      "when": "특정 채널·계정에서 킬스위치가 발동 중",
      "metric": "affected_scope",
      "condition": "!= single_channel_account",
      "action": "발동 범위가 계정 단위를 벗어나 다른 채널까지 차단되면 설계 결함으로 즉시 알림·수정",
      "guardrail": "글로벌(전 채널) 킬스위치는 사람이 명시적으로 선택한 경우만 허용",
      "confidence": "medium",
      "stage": "setup",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-bid-change-magnitude-cap",
      "when": "1회 자동 조치의 입찰가 변경률 또는 예산 변경률이 설계 상한 초과",
      "metric": "change_ratio",
      "condition": "abs(bid_change_pct) > 20 OR abs(budget_change_pct) > 30",
      "action": "변경폭을 설계 상한으로 클램프 후 적용",
      "guardrail": "네이버 자동입찰 도움말은 예산·타겟팅 변경이 학습을 재시작시킨다고만 명시하고 %상한은 규정하지 않음(2026-08-23 확인, 고정값 없음) — 구글애즈('About bid strategy statuses')·메타('Significant Edits and Learning Phase')도 고정 %임계치를 공개하지 않음을 교차 확인(2026-08-23, 메타는 금액 크기 예시만 제공: $100→$101 낮은 가능성/$100→$1000 재학습 가능) — 3개 플랫폼 모두 공식 근거 없는 설계값이므로 상한 조정 시 confidence를 low로 유지",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-change-frequency-floor",
      "when": "동일 엔티티가 직전 변경으로부터 최소 간격 이내에 재변경 대상으로 선정 (자동입찰 그룹: 1~2주 미만, 수동입찰 그룹: 6시간 미만/설계값)",
      "metric": "hours_since_last_change, bid_mode",
      "condition": "(bid_mode == 'auto' AND hours_since_last_change < 336) OR (bid_mode == 'manual' AND hours_since_last_change < 6)",
      "action": "이번 사이클 변경 보류, 다음 주기로 이연",
      "guardrail": "자동입찰 그룹의 1~2주(≈336시간) 기준은 네이버 공식 자동입찰 도움말의 학습기간·재시작 조건에 근거하며, 구글애즈 공식 학습기간('최대 3주 또는 1~2 전환주기', answer/13020501)이 같은 자릿수 범위에서 교차 확인되어 confidence를 medium에서 high로 상향(2026-08-23); 수동입찰 그룹의 6시간은 공식 근거 없는 설계값(confidence low)으로 유지. 긴급 halt(사고성 statusReason) 트리거는 두 경우 모두 이 최소 간격 예외로 즉시 실행",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-concurrent-edit-lock",
      "when": "PUT 직전 GET 재조회에서 editTm이 자가개선 시스템 로그에 없는 시점으로 변경됨",
      "metric": "manual_edit_detected",
      "condition": "== true",
      "action": "이번 사이클 조치 skip, 사람이 수동 변경했음을 알림",
      "guardrail": "공식 optimistic-lock 필드 미확인 상태이므로 자체 로그 대조로만 판단, 오탐 시 즉시 재시도 금지",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-batch-size-guard",
      "when": "자동 조치 배치가 키워드 생성 100개 또는 일괄수정 200개 한도 초과로 구성",
      "metric": "batch_size",
      "condition": "create_batch_size > 100 OR update_batch_size > 200",
      "action": "배치를 한도 이하로 분할 전송",
      "guardrail": "분할 전송 순서는 원래 우선순위 유지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-repeated-error-standdown",
      "when": "동일 엔티티에서 429 또는 3401/3402 에러가 반복 발생",
      "metric": "consecutive_error_count",
      "condition": ">= 3",
      "action": "해당 엔티티를 이번 사이클 조치 대상에서 제외, 다음 사이클로 이연",
      "guardrail": "동일 요청 즉시 재시도 금지, backoff 후에도 반복되면 인간 알림",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-rollback-status-trigger",
      "when": "자동 조치 직후 대상 엔티티 statusReason이 *_DISAPPROVED, *_ABNORMAL_INTERLOCK, LACK_OF_ACCOUNT_BALANCE, REFUND_IN_PROGRESS 중 하나로 전환",
      "metric": "post_action_status_halt",
      "condition": "== true",
      "action": "변경 전 값으로 즉시 롤백 PUT 실행",
      "guardrail": "롤백은 직전 자가개선 시스템이 기록한 변경 전 값이 있을 때만 자동 실행, 없으면 인간 알림",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-rollback-performance-degradation",
      "when": "조치 후 관찰창(48~72시간) 동안 ROAS 또는 전환수가 조치 전 대비 설계 임계치 이상 악화",
      "metric": "post_action_roas_delta_pct",
      "condition": "< -30",
      "action": "롤백 후보로 큐잉, 인간 승인 후 롤백 PUT 실행",
      "guardrail": "48~72시간 관찰창과 -30% 임계치는 공식 근거 없는 설계값(고정 관찰창 값 자체가 공식 문서에 없음, 2026-08-23 확인). 네이버 전환추적 간접전환 귀속기간이 7~20일(설정 가능)임이 공식 확인되어[전환추적 도움말], 48~72시간 시점 판정은 간접전환 상당수가 미집계된 조기 신호임을 승인 화면에 고지해야 한다. 구글애즈 실험 공식 최소 기간(2~3주 또는 4~6주, answer/6318747·10682377, 2026-08-23 확인)도 48~72시간이 '완결된 결론'이 아닌 '조기 신호'일 뿐임을 추가로 뒷받침하지만, 목적(완결 실험 vs 조기 이상감지)이 달라 수치를 그대로 대입하지는 않는다. 자동 롤백 금지, 관찰창 미충족(48시간 미만) 상태에서는 판정 보류",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-platform-forced-change-exclusion",
      "when": "네이버 공지/릴리즈노트로 예고된 강제 전환 일정에 해당하는 필드 값이 자가개선 로그에 없는 시점에 변경됨(예: MAXCONV→NONE)",
      "metric": "platform_forced_change_detected",
      "condition": "== true",
      "action": "해당 변경을 '플랫폼發'으로 태깅, 롤백 대상에서 제외",
      "guardrail": "화이트리스트는 공지/릴리즈노트 원문 확인 후에만 등록, 임의 추정 금지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-naver-rollback-readback-confirm",
      "when": "롤백 PUT 실행 완료",
      "metric": "rollback_readback_diff",
      "condition": "!= 0",
      "action": "GET 재조회로 원복값 대조, 불일치 시 재시도 1회 후 인간 알림",
      "guardrail": "재시도는 1회로 제한, 반복 실패 시 자동화 정지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-lookback-window-cap",
      "when": "selfcheck 데이터 조회 lookback이 report_type별 공식 상한 초과",
      "metric": "lookback_days",
      "condition": "lookback_days > max_days_by_report_type[report_type]",
      "action": "lookback을 상한값으로 캡, 초과 요청 로그",
      "guardrail": "report_type 매핑값(92/365/180/365/45)은 FAQ-stat 개정 시에만 수정",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-min-sample-design-value",
      "when": "관측window(7~14일, FAQ 1350 자동입찰 학습기간과 정합) 내 전환수 또는 노출수가 설계값 최소치 미만인데 개선 액션을 시도",
      "metric": "conversions_in_window",
      "condition": "< 20 OR impressions_in_window < 1000",
      "action": "액션 보류, 표본 축적 대기 상태로 전환",
      "guardrail": "관측window(7~14일)는 ads.naver.com FAQ 1350의 자동입찰 학습기간(통상 1~2주) 근거로 confidence medium 승격(2026-08-23). min_conversions=20/min_impressions=1000 카운트는 여전히 공식·업계 근거 없음(2026-08-23 재조사) — 설계값(제안) 유지, confidence low",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-attribution-lag-configured-window",
      "when": "조치 후 성과 판단에 전환 데이터를 계정에 설정된 전환추적기간(7~20일) 만료 전에 확정치로 사용하려는 경우",
      "metric": "attribution_lag_days_assumed",
      "condition": "< account_conversion_tracking_period_days",
      "action": "계정 설정값(전환추적기간, 7~20일 범위)이 지날 때까지는 전환 데이터를 참고용으로만 표시하고 확정 성과 판단에 쓰지 않음. 설정값 조회 불가 시 보수적으로 20일을 상한 대체값으로 사용",
      "guardrail": "ads.naver.com FAQ 949 공식 정의(직접전환 30분 이내, 간접전환 30분~전환추적기간) 확인(2026-08-23) — 고정 '3일' 설계값 폐기, 계정별 실제 설정값을 반드시 조회해서 사용",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-status-halt-signal",
      "when": "폴링한 statusReason이 LACK_OF_ACCOUNT_BALANCE, REFUND_IN_PROGRESS, *_ABNORMAL_INTERLOCK, *_DISAPPROVED 중 하나로 전환",
      "metric": "status_halt_flag",
      "condition": "== true",
      "action": "해당 엔티티의 자가개선 루프 즉시 정지, 원인 카테고리와 함께 알림",
      "guardrail": "halt 코드 목록은 FAQ statusReason 표 기준으로만 갱신, 임의 추가 금지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-performance-anomaly-zscore",
      "when": "salesAmt/ccnt/impCnt 일별 값이 최근 7일 평균 대비 z-score 임계치 초과",
      "metric": "daily_metric_zscore",
      "condition": "abs(z) > 2.5",
      "action": "이상치 플래그, 자동 액션 보류하고 인간 검토 큐에 등록",
      "guardrail": "공식·업계 근거 없음(2026-08-23 조사, 네이버 API·도움말에 이상치 임계치 가이드 없음, WebSearch 세션 예산 소진으로 업계 벤치마크 추가 탐색 미완료). z-score 2.5는 정규분포 기준 약 상하위 0.6%(양측 약 1.2%)를 벗어나는 일반 통계 관행 참고치일 뿐 광고 업계 전용 근거는 아님 — 설계값(제안) 유지, 데이터 5일 미만 누적 시 판정 보류",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-429-backoff",
      "when": "동일 자원에 대해 429 응답이 연속 발생",
      "metric": "consecutive_429_count",
      "condition": ">= 3",
      "action": "지수 backoff 적용 후 재시도, 5회 연속 실패 시 이번 사이클 skip",
      "guardrail": "재확인(2026-08-23): 공식 FAQ에 '호출량 제한은 없으나 광고주별 호출 속도 제한이 있으며 정확한 수치는 정해지지 않았고 시스템 사용량에 따라 실시간으로 설정된다'고 명시 — 고정 RPS가 '공식적으로 없다'는 사실은 confidence high, 그로부터 도출한 backoff 임계치(consecutive_429_count>=3)는 여전히 설계값(제안)이라 confidence medium 유지",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-stat-finalization-lag",
      "when": "리포트 status가 CHANGED이거나, 지표 반영 후 48시간이 지나지 않은 데이터를 확정치로 사용해 조치 판단",
      "metric": "report_status_or_hours_since_reflected",
      "condition": "report_status == 'CHANGED' OR hours_since_reflected < 48",
      "action": "CHANGED 상태이거나 반영 48시간 이내인 데이터는 추세 참고용으로만 표시하고 확정 조치 판단에서 제외, 48시간 경과 후 재조회해 확정치로 사용",
      "guardrail": "공식 근거로 대체(2026-08-23 2라운드 — 공지 페이지가 SPA라 막혔던 것을 RSS feed.xml로 확보: 2025-09-26 공지, 적용 2025-10-27). 표준 지연 3시간→2시간, cycleBaseTm 분단위 갱신. 무효클릭 제거·외부매체 지연·시스템 문제 시에만 최대 48시간 이내 재변경 가능하며 이 경우 리포트가 CHANGED로 마킹됨 — 임의 'D-2' 가정 폐기, CHANGED 상태 우선 확인 + 48시간 윈도우로 교체",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-naver-data-validity-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-naver-budget-limited-misattribution",
      "when": "캠페인 statusReason이 CAMPAIGN_LIMITED_BY_BUDGET 또는 CAMPAIGN_PAUSED/ENDED 인 동안 하위 그룹의 CTR·전환율 저하를 성과 문제로 판정",
      "metric": "campaign_exposure_blocked",
      "condition": "== true AND action_type == 'performance_based'",
      "action": "해당 기간 하위 엔티티를 성과 평가 대상에서 제외, '노출 기회 없음'으로 별도 태깅",
      "guardrail": "예산 재개 후 최소 1일 데이터가 쌓이기 전까지는 재평가 금지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "naver"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-bid-budget-change-magnitude-cap",
      "when": "입찰가 또는 일예산 조정 제안 폭이 직전 값 대비 산출됨",
      "metric": "change_magnitude_pct",
      "condition": "abs(change_magnitude_pct) > 20",
      "action": "20%로 절삭 후 재제안, 절삭 후에도 공식 범위(입찰 100~100,000원, 예산 10,000~1,000,000,000원) 이탈 시 경계값으로 클램프",
      "guardrail": "공식: 1회 변경폭 고정 상한 없음(언제든지 원하는 값으로 변경 가능, Faq.html) — 20%는 그 위에 얹은 자체 리스크 관리 설계값, 사람 승인 단계에서 절삭 여부 표시. 메타 공식 문서도 예산 변경폭을 %가 아닌 magnitude 사례($100→$101 낮음, $100→$1000 유발 가능)로만 설명해 정량 상한 부재가 교차채널로 확인됨(facebook.com/business/help/316478108955072)",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-change-frequency-cap",
      "when": "동일 키워드/캠페인에 대한 자동 조정 제안이 직전 조정 후 3일 이내 재생성 시도",
      "metric": "days_since_last_change",
      "condition": "< 3",
      "action": "신규 조정 제안 생성을 보류하고 관찰 기간 만료 후 재평가하도록 큐에 지연 등록",
      "guardrail": "공식: 변경 빈도 고정 제한 없음(\"언제든지 변경 가능\", Faq.html) — 다만 최적화 기간(7~14일) 유지 권장 취지를 반영해 3일 관찰을 자체 설계값으로 둠, 원인 분리 불가능 방지",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-concurrent-change-lock",
      "when": "같은 키워드/광고그룹/캠페인에 대해 관찰 창(3일) 내 입찰가·예산·제외키워드·타겟ROAS 중 2개 이상 변수 변경 제안이 동시 생성",
      "metric": "concurrent_variable_change_count",
      "condition": "> 1",
      "action": "우선순위가 가장 높은 변수 하나만 남기고 나머지는 다음 관찰 주기로 연기",
      "guardrail": "동시 변경 시 어느 조정이 성과 변화의 원인인지 검증 불가 — 예외 없음. 메타 공식 문서도 타겟팅·크리에이티브·최적화이벤트·입찰전략 변경을 각각 독립적 재학습 유발 사유로 분류해 변수 분리 원칙을 교차확인(facebook.com/business/help/316478108955072)",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-batch-change-volume-cap",
      "when": "하루 자동 개선 배치가 건드리는 키워드/캠페인 수 집계",
      "metric": "daily_changed_entities_ratio",
      "condition": "> 0.3",
      "action": "활성 대상의 30%를 넘는 초과분은 다음 날 배치로 분할 이월",
      "guardrail": "대량 동시 변경은 약관상 비정상 조작으로 오인될 리스크 및 사람의 실행 한도를 고려한 상한(설계값) — 30% 수치는 공식·업계 근거 없음(2026-08-23 조사: policy/·Faq.html·guide 확인)",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-rollback-trigger-regression",
      "when": "사람이 실행 확인한 액션의 관찰 기간(최소 7일, 최적화 대상 캠페인은 최대 14일) 경과 후 성과 재측정",
      "metric": "roas_delta_pct, impressions_delta_pct",
      "condition": "roas_delta_pct <= -20 OR impressions_delta_pct <= -50",
      "action": "액션 이전 값으로 되돌리는 롤백 제안 생성",
      "guardrail": "관찰 기간 하한 7일은 공식 안내(매출최적화·AI스마트 최적화 기간 7~14일 동안 유지 권장, Faq.html)를 적용; 귀속창 14일과 최적화 잠금창 미경과 구간은 롤백 판단에서 제외(verify-selfcheck-coupang-data-anomaly와 연동). 악화폭(20%p/50%) 수치는 공식·업계 근거 없음(2026-08-23 조사)",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-rollback-human-execution-only",
      "when": "롤백 제안의 실행 단계",
      "metric": "execution_mode",
      "condition": "!= 'human_manual'",
      "action": "자동 실행 시도를 차단하고 '롤백 제안' 상태로만 저장",
      "guardrail": "공식 API 부재 — 롤백도 매크로/RPA 자동 실행 금지, 세팅 단계와 동일 게이트",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-repeated-rollback-loop-exit",
      "when": "동일 키워드/캠페인이 연속 2회 이상 롤백됨",
      "metric": "consecutive_rollback_count",
      "condition": ">= 2",
      "action": "해당 대상을 자동 개선 루프에서 제외, 사람 전담 검토 목록으로 이동",
      "guardrail": "반복 임계값은 설계값 — 계정별 리스크 성향에 따라 조정 가능, 공식·업계 근거 없음(2026-08-23 조사)",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-pause-resume-relearn-window",
      "when": "캠페인이 OFF 상태에서 ON으로 재개됨",
      "metric": "days_since_resume",
      "condition": "< 7",
      "action": "재개 후 7일 구간을 '재학습 중'으로 표시, 이 구간 성과로 추가 개선 액션 생성 금지",
      "guardrail": "공식 FAQ의 매출최적화·AI스마트 광고 최적화 소요 \"약 7일에서 14일\"(Faq.html)을 캠페인 재개 상황에 유추 적용, 하한 7일 채택. 메타 공식 '머신 러닝 단계' 문서는 '광고 세트 7일 이상 일시중지 후 재개 시 학습 재진입', '재진입 후 약 1주(50건) 내 재안정화'를 명문화해 독립된 타 채널에서도 동일 자릿수(7일)로 수렴함을 확인(2026-08-23, facebook.com/business/help/112167992830700, /316478108955072) — 쿠팡 자체 수치는 아니지만 교차검증 근거로 채택",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-coupang-terms-risk-signal-halt",
      "when": "부정클릭/비정상 노출 생성 의심 신호 또는 광고 이용료 미납 등 약관상 이용제한 사유 감지",
      "metric": "account_risk_signal",
      "condition": "== true",
      "action": "진행 중인 모든 자동 개선 제안 생성을 즉시 중단, 담당자 알림",
      "guardrail": "계정 제한·중지는 쿠팡 단독 판단(정책 제12조) — 프로그램은 예방적 중단만 수행",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-attribution-immature-block",
      "when": "축소 액션(입찰인하/제외키워드 등) 판단 구간의 종료일이 오늘-14일보다 최근",
      "metric": "action_window_end_date",
      "condition": "action_window_end_date > today - 14d",
      "action": "해당 구간 데이터로 축소 액션 생성 금지, '관찰중' 유지",
      "guardrail": "확대 액션도 동일 잠정 구간 데이터 사용 금지(과대평가 방지)",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-optimization-lock-window",
      "when": "목표 ROAS/자동입찰 전략을 마지막으로 변경한 지 14일 미경과",
      "metric": "days_since_last_strategy_change",
      "condition": "< 14",
      "action": "동일 캠페인/그룹에 신규 개선 액션 생성 보류",
      "guardrail": "공식 안내(매출최적화·AI스마트 광고 최적화 소요 \"약 7일에서 14일\", Faq.html) 범위 내 상한을 그대로 채택 — 공식 범위를 직접 적용한 값이라 confidence 상향",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-report-staleness-gate",
      "when": "자가검증 루프가 참조하는 리포트 파일의 다운로드 후 경과 시간",
      "metric": "report_age_hours",
      "condition": "> 24",
      "action": "신규 리포트 재다운로드를 사람에게 요청, 완료 전까지 신규 액션 생성 중단",
      "guardrail": "API 부재로 자동 재다운로드 불가 — 알림만 발송. 24시간이라는 정확한 수치는 공식·업계 근거 없음(2026-08-23 조사). 네이버 STATS API 공식 공지는 지표가 최대 48시간 이내 재변경(CHANGED)될 수 있다고 명시해, API 완비 채널에서도 유사 자릿수(수십 시간)의 재검증 창을 두는 관행이 있음을 교차확인(2026-08-23 2차, naver.github.io/searchad-apidoc/notice/) — 쿠팡 리포트 다운로드 경과시간과 직접 동일 개념은 아니므로 유추 근거",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-min-sample-gate",
      "when": "키워드/캠페인의 최근 7일 누적 클릭 또는 노출이 최소치 미만",
      "metric": "clicks_7d, impressions_7d",
      "condition": "clicks_7d < 10 OR impressions_7d < 1000",
      "action": "축소 액션 생성 금지, '표본부족·관찰중' 라벨 부여",
      "guardrail": "임계값(클릭10/노출1,000)은 공식 미공개 설계값 — 상품·카테고리별 조정 가능. 네이버(224개 공지 전수 확인해도 자동입찰 최소 표본 비공개)·메타(약 50건/1주, 측정지표 상이)와 교차조사해도 쿠팡 특정 숫자의 공식 근거는 없음(2026-08-23 2차 재조사) — 표본 하한을 두는 관행 자체만 교차확인",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-realtime-trend-noise-block",
      "when": "액션 트리거 지표의 데이터 소스가 실시간(최대 10분 전) 대시보드 트렌드",
      "metric": "metric_source",
      "condition": "== 'realtime_trend'",
      "action": "일 단위 마감 리포트 소스로 교체 후 재판단, 실시간 소스로는 액션 생성 금지",
      "guardrail": "실시간 값은 사람용 모니터링 표시에만 허용",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-fraud-click-cvr-drop-isolate",
      "when": "클릭수가 직전 7일 평균 대비 급증(200% 이상)했는데 동시에 CVR이 50% 이상 하락",
      "metric": "click_ratio_vs_avg7d, cvr_delta_pct",
      "condition": "click_ratio_vs_avg7d > 2.0 AND cvr_delta_pct < -50",
      "action": "해당 구간을 이상치로 격리, 증액·감액 어떤 개선 액션도 이 구간 데이터로 생성 금지",
      "guardrail": "쿠팡 자체 부정클릭 탐지·무효처리가 선행 — 프로그램은 판단 데이터에서만 배제, 계정 조치는 하지 않음. 200%/50% 배율은 공식·업계 근거 없음(2026-08-23 조사, 판정 알고리즘 비공개)",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-conversion-regression-anomaly",
      "when": "누적 전환수 또는 누적 전환매출이 전일 대비 감소",
      "metric": "cumulative_conversions_delta, cumulative_revenue_delta",
      "condition": "< 0",
      "action": "해당 일자를 '검증필요'로 표시, 액션 트리거 대상에서 제외",
      "guardrail": "파싱오류와 실제 취소·반품 반영을 프로그램이 구분할 수 없으므로 자동 판단 금지",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-coupang-data-anomaly",
      "section": "verify",
      "id": "verify-selfcheck-coupang-roas-asymmetric-conservatism",
      "when": "리포트 원본 ROAS를 확대 액션(입찰인상/예산증액)의 트리거로 사용",
      "metric": "roas_basis",
      "condition": "roas_basis == 'raw_reported'",
      "action": "VAT 보정(×1.1) 및 취소·반품 미반영 여지를 반영한 보수적 ROAS로 재계산 후 판단",
      "guardrail": "축소 액션은 원본 ROAS 사용을 허용(보수적 방향으로만 비대칭 허용)",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "coupang"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-budget-step-precheck",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "실행 예정 예산 변경폭이 직전 예산 대비 ±20% 초과",
      "metric": "proposed_budget_change_pct",
      "condition": "abs(proposed_budget_change_pct) > 0.20",
      "action": "자동 실행 차단, 20%로 절삭안 생성 또는 승인 대기열 등록",
      "guardrail": "20%는 공식 수치 아님을 레코드에 명시, 긴급 전면 중단은 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-cbo-adset-budget-invalid",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "캠페인이 CBO(campaign.daily_budget 또는 lifetime_budget 설정)인데 광고세트 예산 변경 액션이 생성됨",
      "metric": "campaign_budget_optimization, action_target_level",
      "condition": "campaign_budget_optimization = true AND action_target_level = 'adset' AND action_type = 'budget_change'",
      "action": "액션 기각, 캠페인 레벨 예산 액션으로 재제안",
      "guardrail": "광고세트 최소/최대 지출 한도 설정은 예외 허용",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-significant-edit-on-learning",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "중대 수정(타겟·소재·최적화 이벤트·입찰·큰 예산 변경)으로 분류된 액션의 대상이 학습 중 또는 학습 제한 광고세트",
      "metric": "is_significant_edit, learning_status",
      "condition": "is_significant_edit = true AND learning_status IN ['LEARNING','FAIL']",
      "action": "실행 차단, 학습 종료 또는 통합 액션 이후로 연기",
      "guardrail": "정책 위반 소재 교체는 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-concurrent-change-lock",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "동일 캠페인/광고세트에 관찰 창(72h) 내 서로 다른 변수 2개 이상 변경이 예정되거나 이미 실행됨",
      "metric": "distinct_change_variables_72h",
      "condition": ">= 2",
      "action": "후순위 액션 보류, 1변수 1변경 큐로 직렬화",
      "guardrail": "계정 전체 일일 중대 수정 대상이 활성 광고세트의 30% 초과 시 배치 분할",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-observation-window",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "대상 엔티티의 마지막 변경 후 경과 시간이 72시간 미만인데 새 액션 생성",
      "metric": "hours_since_last_change",
      "condition": "< 72",
      "action": "액션 보류, 관찰 종료 시각에 재평가 예약",
      "guardrail": "거부·계정 제한·과지출 대응은 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-cpm-cause-mismatch",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "CPM 7일 상승률 20% 이상에 대한 액션이 있는데 원인 진단(fatigue/auction) 필드가 없거나 진단과 액션 유형이 불일치",
      "metric": "cpm_change_7d, frequency_change_7d, ctr_change_7d, diagnosis",
      "condition": "cpm_change_7d >= 0.2 AND (diagnosis IS NULL OR (diagnosis='fatigue' AND action_type NOT IN ['creative_swap','audience_expand']) OR (diagnosis='auction' AND action_type IN ['creative_swap']))",
      "action": "액션 기각, 진단 규칙(빈도↑+CTR↓=피로 / 빈도·CTR 평탄+계정 전체 CPM↑=경매) 재적용",
      "guardrail": "경매 압력 진단 시 기본 액션은 '무행동'",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-rollback-trigger",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "변경 후 3일 이상 경과·표본 충족 상태에서 CPA가 변경 전 7일 대비 30% 이상 악화가 2일 연속",
      "metric": "cpa_vs_prechange_baseline, consecutive_days",
      "condition": "cpa_vs_prechange_baseline >= 1.30 AND consecutive_days >= 2",
      "action": "이전 설정으로 자동 복원, 롤백 사유 기록",
      "guardrail": "30% 임계값과 '이전 설정 복원' 액션은 공식·업계 문서로 확인되지 않은 내부 설계값(제안). theoptimizer 사례는 2일 연속 임계 초과 시 예산 20% 축소(롤백 아님)를 사용. '2일 연속' 패턴만 사례와 일치. 엔티티당 자동 롤백 1회, 이후 재변경은 사람 승인",
      "confidence": "low"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-human-approval-threshold",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "변경폭 20% 초과 OR 일 예산 절대액이 계정 일 지출의 25% 초과 OR 지출 상위 3개 캠페인 일시중지 OR 최적화 이벤트·입찰 전략 변경 OR 롤백 후 재변경",
      "metric": "approval_trigger_flags",
      "condition": ">= 1",
      "action": "자동 실행 금지, 승인 대기열 등록",
      "guardrail": "승인자 식별자·시각 기록 없이는 해제 불가, 비율은 내부 기준",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-ad-rejection-halt",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "광고 effective_status가 DISAPPROVED, WITH_ISSUES, PENDING_REVIEW 중 하나",
      "metric": "ad_effective_status",
      "condition": "IN ['DISAPPROVED','WITH_ISSUES','PENDING_REVIEW']",
      "action": "해당 광고세트 최적화 액션 중단, 성과 판정에서 제외, 운영자 알림",
      "guardrail": "거부 광고의 성과 하락을 소재 부진으로 라벨링 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-account-restriction-halt",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "광고 계정 account_status가 1(ACTIVE)이 아님",
      "metric": "account_status",
      "condition": "!= 1",
      "action": "계정 범위 전체 액션 중단, 상태 코드와 함께 즉시 알림",
      "guardrail": "상태 복구 확인 후에도 24시간 관찰 전 자동 액션 재개 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-asc-manual-targeting-invalid",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "Advantage+ 판매 캠페인에 수동 오디언스 축소·상세타겟·배치 제한 액션이 생성됨",
      "metric": "campaign_type, action_type",
      "condition": "campaign_type = 'advantage_plus_sales' AND action_type IN ['audience_narrow','detailed_targeting','placement_restrict']",
      "action": "액션 기각, 허용 액션(예산·소재·기존 고객 비중)으로 재제안",
      "guardrail": "지역·연령 법적 제한 설정은 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-pause-resume-relearn",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "7일 이상 일시중지된 광고세트를 재개하는 액션",
      "metric": "paused_days",
      "condition": ">= 7",
      "action": "재개 허용하되 '학습 재시작 예상' 표기, 재개 후 7일간 CPA 판정 면제",
      "guardrail": "재개 직후 예산 증액 동시 실행 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-action-safety",
      "section": "verify",
      "id": "verify-selfcheck-meta-action-record-completeness",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "액션 레코드에 변경 전/후 값, 근거 지표 스냅샷, 어트리뷰션 설정, 중대 수정 여부, 관찰 종료 시각, 롤백 경로 중 하나라도 누락",
      "metric": "missing_record_fields",
      "condition": ">= 1",
      "action": "실행 차단, 누락 필드 채운 뒤 재제출",
      "guardrail": "롤백 경로 없는 액션은 어떤 경우에도 실행 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-learning-phase-freeze",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "광고세트 learning_stage_info.status = LEARNING 또는 최근 7일 최적화 이벤트 < 50 인데 예산·타겟·소재·최적화 이벤트 변경 액션이 생성됨",
      "metric": "learning_status, optimization_events_7d",
      "condition": "learning_status = 'LEARNING' OR optimization_events_7d < 50",
      "action": "액션을 '보류'로 강등, 사유 '학습 단계 데이터 미성숙' 기록",
      "guardrail": "정책 위반·과지출 긴급 중단은 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-learning-limited-action-type",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "learning_status = FAIL(학습 제한)인 광고세트에 대해 소재 교체·타겟 축소 등 이벤트 수를 더 줄이는 액션이 제안됨",
      "metric": "learning_status, proposed_action_type",
      "condition": "learning_status = 'FAIL' AND proposed_action_type NOT IN ['consolidate','budget_up','loosen_optimization_event']",
      "action": "액션 기각, 통합·예산 상향·최적화 이벤트 완화 중 택1로 재제안 요구",
      "guardrail": "학습 제한 상태를 '성과 부진'으로 라벨링 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-attribution-lag-window",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "CPA·ROAS 악화 판정의 비교 창에 최근 72시간이 포함돼 있고 전환 시점 기준 재집계가 없음",
      "metric": "judgment_window_end_offset_hours, conversion_time_recheck",
      "condition": "judgment_window_end_offset_hours < 72 AND conversion_time_recheck = false",
      "action": "판정 무효, 창 종료를 72시간 이전으로 이동 후 재계산",
      "guardrail": "action_report_time=mixed 기본값(2025-06-10부터, 공식 확인)에서는 오프사이트 전환이 전환 시점으로 집계되지만 기여 창이 열려있는 기간엔 값이 계속 늘 수 있음. 72시간이라는 구체 수치 자체는 공식 미확인 내부 설계값(제안). 지출 급증 등 노출·클릭 기반 이상은 이 룰 적용 제외",
      "confidence": "low"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-attribution-setting-mismatch",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "전후 기간 또는 광고세트 간 비교의 action_attribution_windows 설정이 다름",
      "metric": "attribution_window_before, attribution_window_after",
      "condition": "attribution_window_before != attribution_window_after",
      "action": "비교 무효, 동일 창으로 재조회 후 재판정",
      "guardrail": "판정 레코드에 어트리뷰션 설정 필드 누락 시 자동 무효",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-min-sample-record",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "액션 레코드에 표본 수치(전환수·지출/목표CPA 배수)가 없거나 전환 < 50 AND 지출 < 목표CPA×2",
      "metric": "conversions_in_window, spend_over_target_cpa",
      "condition": "sample_fields_missing = true OR (conversions_in_window < 50 AND spend_over_target_cpa < 2)",
      "action": "액션 '보류' 강등, 표본 충족 시점 예측 알림",
      "guardrail": "표본 미달 상태의 일시중지 액션은 사람 승인 필수",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-ios-modeled-share",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "광고세트 iOS 노출 비중이 50% 이상인데 판정 창이 7일 이하",
      "metric": "ios_impression_share, judgment_window_days",
      "condition": "ios_impression_share >= 0.5 AND judgment_window_days <= 7",
      "action": "판정 창 14일로 확장 후 재판정, 결과에 '모델링 비중 높음' 표기",
      "guardrail": "임계값 50%·14일은 내부 기준, 공식 수치 아님",
      "confidence": "low"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-conversion-spike-anomaly",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "일 전환수가 직전 7일 중앙값의 3배 초과인데 클릭수 변동은 ±30% 이내",
      "metric": "conversions_vs_7d_median, clicks_change_pct",
      "condition": "conversions_vs_7d_median > 3 AND abs(clicks_change_pct) <= 0.3",
      "action": "증액·스케일 액션 차단, 픽셀·CAPI 중복(event_id 매칭) 점검 태스크 생성",
      "guardrail": "이상치 해소 확인 전 해당 데이터는 판정에서 제외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-reporting-outage-noop",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "Insights API 오류(error_code 4/100/613/80004 등 레이트 리밋·한도 초과, 2026-08-23 원문 확인) 또는 핵심 지표 null, 또는 노출 > 0 인데 지출 = 0 같은 불일치",
      "metric": "api_error, metric_null_count, impressions, spend",
      "condition": "api_error = true OR metric_null_count > 0 OR (impressions > 0 AND spend = 0)",
      "action": "판정 중단, 재시도 예약, 운영자 알림",
      "guardrail": "데이터 부재를 성과 0으로 해석 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-meta-data-validity",
      "section": "verify",
      "id": "verify-selfcheck-meta-restatement-recheck",
      "stage": "selfcheck",
      "channel": "meta",
      "when": "액션 실행 후 7일 경과(어트리뷰션 창 마감) 시점에 동일 판정 재실행 결과가 원 판정과 반대",
      "metric": "judgment_reversal_rate_30d",
      "condition": "reversed = true (개별) / judgment_reversal_rate_30d > 0.2 (누적)",
      "action": "개별: 롤백 검토 태스크 생성 / 누적: 판정 창 기본값 +3일 상향",
      "guardrail": "인사이트는 보고 후 28일이 지나면 더 이상 변경되지 않는다(2026-08-23 공식 문서 확인, confidence high) — 7일 재검토가 최종 확정치는 아님에 유의. 뒤집힘 비율 20% 임계값 자체는 내부 설계값(제안). 판정 창 변경은 사람 승인 후 적용",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-budget-limited-misread",
      "stage": "selfcheck",
      "channel": "google",
      "when": "'예산으로 제한됨' 배지를 근거로 증액을 제안했는데 Search lost IS (budget)가 0이거나 수익성 조건 미충족",
      "metric": "lost_is_budget, roas_7d, target_roas",
      "condition": "lost_is_budget = 0 OR roas_7d < target_roas",
      "action": "증액 제안 기각, 손실 원인 재분석 큐 등록",
      "guardrail": "공유 예산은 같은 예산 사용 캠페인 전체 성과로 판단",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-daily-overspend-false-alarm",
      "stage": "selfcheck",
      "channel": "google",
      "when": "엔진이 '일예산 초과 지출'을 이상 징후로 분류했는데 당일 지출이 일예산의 2배 이하",
      "metric": "daily_spend_vs_daily_budget",
      "condition": "<= 2.0",
      "action": "이상 징후 해제(정상 초과 게재), 월 누적 지출이 일예산×30.4 초과 시에만 재플래그",
      "guardrail": "2배 초과는 그대로 이상으로 유지하고 사람 알림",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-is-loss-action-mismatch",
      "stage": "selfcheck",
      "channel": "google",
      "when": "순위 손실 IS가 예산 손실 IS보다 큰데 액션이 예산 증액이거나, 그 반대",
      "metric": "lost_is_rank, lost_is_budget, proposed_action",
      "condition": "(lost_is_rank > lost_is_budget AND proposed_action = 'budget_increase') OR (lost_is_budget > lost_is_rank AND proposed_action IN ['bid_increase','target_loosen'])",
      "action": "액션 기각, 손실 원인에 맞는 레버(목표값·품질 vs 예산)로 재제안",
      "guardrail": "키워드 레벨 예산 손실 IS를 근거로 든 판단은 데이터 존재 오류로 무효",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-pmax-unsupported-lever",
      "stage": "selfcheck",
      "channel": "google",
      "when": "PMax 캠페인에 채널 제외·채널별 예산 이동·게재위치 입찰 조정 액션이 제안됨",
      "metric": "proposed_action_type, campaign_type",
      "condition": "campaign_type = 'PERFORMANCE_MAX' AND proposed_action_type IN ['channel_exclude','channel_budget_shift','placement_bid']",
      "action": "구현 불가 액션으로 기각, 허용 레버(애셋 교체·브랜드 제외·URL 확장·제외 키워드·목표·예산)로 재제안",
      "guardrail": "채널별 보고는 조회 전용(참고 정보)이며 제어 근거로 사용 금지 — 근거: 고객센터 10724817(캠페인 수준 제어 FAQ 5개 항목에 채널별 예산/입찰 없음), 16683501(채널 성과 보고서는 조회만 가능)",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-negative-keyword-sample",
      "stage": "selfcheck",
      "channel": "google",
      "when": "제외 키워드 추가 제안의 근거 검색어 표본이 부족하거나 브랜드·핵심 카테고리 단어 포함",
      "metric": "search_term_clicks, search_term_cost_vs_target_cpa, contains_brand_or_core",
      "condition": "(search_term_clicks < 30 AND search_term_cost_vs_target_cpa < 2.0) OR contains_brand_or_core = true",
      "action": "추가 보류, 표본 누적 후 재평가 또는 사람 검토",
      "guardrail": "표본 임계값(30클릭·목표 CPA 2배)은 휴리스틱이며 계정별 조정 허용",
      "confidence": "low"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-negative-keyword-scope-sim",
      "stage": "selfcheck",
      "channel": "google",
      "when": "제안된 제외 키워드(매치 유형 포함)가 최근 30일 전환 발생 검색어를 차단하거나 배치 수량이 20개 초과",
      "metric": "blocked_converting_terms_30d, batch_size",
      "condition": "blocked_converting_terms_30d >= 1 OR batch_size > 20",
      "action": "해당 키워드 제외 또는 매치 유형 축소(정확 제외), 초과분은 승인 대기",
      "guardrail": "PMax 계정 단위 제외는 전체 캠페인 영향 시뮬레이션 필수",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-learning-trigger-spacing",
      "stage": "selfcheck",
      "channel": "google",
      "when": "학습 중 상태를 유발하는 변경(입찰 전략·예산 15% 초과·전환 설정) 간 간격이 14일 미만",
      "metric": "days_since_last_learning_trigger_change",
      "condition": "< 14",
      "action": "후속 변경 보류, 다음 주기로 이연",
      "guardrail": "google-single-lever-change-rule과 중복 적용 시 더 보수적인 쪽 우선",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-pre-action-snapshot",
      "stage": "selfcheck",
      "channel": "google",
      "when": "액션 실행 요청에 실행 전 값 스냅샷(목표·예산·상태·키워드)과 롤백 조건이 없음",
      "metric": "snapshot_exists, rollback_condition_defined",
      "condition": "snapshot_exists = false OR rollback_condition_defined = false",
      "action": "실행 차단, 스냅샷·롤백 조건 생성 후 재요청",
      "guardrail": "스냅샷은 변경 내역 ID와 함께 90일 보관(90일 자체는 본 저장소 설계값이나, 출처 고객센터 2454137 확인 결과 Google 공식 변경 내역 조회는 2년·네이티브 Undo는 30일 이내만 가능 — 31~90일 구간은 API/수동 값 재설정으로만 복구할 것)",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-rollback-trigger",
      "stage": "selfcheck",
      "channel": "google",
      "when": "액션 후 전환 지연 제외 7일 기준 CPA가 목표의 130% 초과 또는 ROAS 70% 미만, 전환 50% 이상 감소, 일 지출 2배 초과 중 하나",
      "metric": "cpa_vs_target_post7d, roas_vs_target_post7d, conv_change_pct, spend_change_ratio",
      "condition": "cpa_vs_target > 1.3 OR roas_vs_target < 0.7 OR conv_change_pct <= -0.5 OR spend_change_ratio > 2.0",
      "action": "스냅샷으로 롤백 실행, 원인 리포트 생성, 동일 액션 30일 재시도 금지",
      "guardrail": "롤백은 학습 중 상태를 재유발하므로 롤백 후 14일 추가 변경 금지; 전환 추적 이상이 원인이면 롤백 대신 태그 복구; 변경 후 30일 초과 시 GUI 네이티브 Undo가 불가하므로(출처: 고객센터 2454137) 스냅샷 값으로 수동/API 재설정할 것",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-human-approval-threshold",
      "stage": "selfcheck",
      "channel": "google",
      "when": "목표값 변경 >10%, 예산 변경 >20% 또는 월 환산 증액이 계정 월예산의 10% 초과, 캠페인/광고그룹 일시중지, 제외 키워드 20개 초과, 전환 액션 설정 변경",
      "metric": "action_risk_class",
      "condition": "action_risk_class IN ['target>10%','budget>20%','budget_abs>10%_monthly','pause','negatives>20','conversion_setting']",
      "action": "자동 실행 차단, 승인 대기열 등록",
      "guardrail": "승인자 식별자·시각이 로그에 기록돼야 해제 가능",
      "confidence": "high"
    },
    {
      "docId": "verify-selfcheck-google-action-safety-rollback",
      "section": "verify",
      "id": "verify-selfcheck-google-scripts-log-reconcile",
      "stage": "selfcheck",
      "channel": "google",
      "when": "Ads Scripts 실행 결과가 미리보기 모드였거나 30분 한도 타임아웃, 또는 스크립트 로그 변경 건수가 변경 내역과 불일치",
      "metric": "script_preview_mode, script_timed_out, script_change_count, change_history_count",
      "condition": "script_preview_mode = true OR script_timed_out = true OR script_change_count != change_history_count",
      "action": "'미실행/부분 실행' 판정, 실행 완료로 기록 금지, 재실행 또는 롤백 판단을 사람에게 이관",
      "guardrail": "대조는 동일 시각 ±5분·동일 계정 기준, 실패 로그는 90일 보관(대조 대상인 Google Ads 변경 내역 자체는 공식 2년간 조회 가능 — 출처: 고객센터 2454137)",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-learning-status-block",
      "stage": "selfcheck",
      "channel": "google",
      "when": "엔진이 목표값·예산·전환 설정 변경을 제안했는데 대상 캠페인의 입찰 전략 상태가 '학습 중'",
      "metric": "bid_strategy_status, learning_reason, days_in_learning",
      "condition": "bid_strategy_status = 'LEARNING'",
      "action": "액션 보류, 학습 사유·경과일 기록, 학습 종료 후 재평가 큐 등록",
      "guardrail": "전환 추적 깨짐·정책 위반 등 명백한 오류 대응은 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-conversion-lag-window",
      "stage": "selfcheck",
      "channel": "google",
      "when": "성과 악화 판정의 근거 구간이 전환 지연 일수 이내의 최근 데이터를 포함",
      "metric": "evaluation_window_end, conversion_delay_days",
      "condition": "today - evaluation_window_end < conversion_delay_days",
      "action": "판정 무효, 최근 conversion_delay_days 제외 후 재계산",
      "guardrail": "전환 지연 값 미제공 시 기본 7일 제외하고 confidence 하향",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-tracking-break-detect",
      "stage": "selfcheck",
      "channel": "google",
      "when": "클릭이 7일 평균의 70% 이상으로 정상인데 전환이 24~48시간 연속 0건",
      "metric": "clicks_24h_vs_avg7d, conversions_24h",
      "condition": "clicks_24h_vs_avg7d >= 0.7 AND conversions_48h = 0",
      "action": "'전환 추적 이상 의심' 플래그, 모든 성과 대응 액션 차단, 태그 진단으로 라우팅",
      "guardrail": "복구 확인 후 해당 기간을 데이터 제외로 등록해야 플래그 해제",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-target-change-magnitude",
      "stage": "selfcheck",
      "channel": "google",
      "when": "엔진이 제안한 tCPA/tROAS 변경 폭이 직전 값 대비 10% 초과",
      "metric": "proposed_target_change_pct",
      "condition": "> 0.10",
      "action": "10% 이하이면 자동 실행, 10~20%는 사람 승인, 20% 초과는 10% 단위 분할 제안으로 대체",
      "guardrail": "출처 상충(10% vs 20%)으로 자동 실행 상한은 보수값 10% 고정",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-target-change-frequency",
      "stage": "selfcheck",
      "channel": "google",
      "when": "직전 목표값 변경 후 14일 미만이거나 30일 내 같은 방향 변경이 3회 이상",
      "metric": "days_since_last_target_change, same_direction_changes_30d",
      "condition": "days_since_last_target_change < 14 OR same_direction_changes_30d >= 3",
      "action": "변경 보류, '목표값 추격' 패턴 경고 후 사람 검토",
      "guardrail": "프로모션 종료 후 원복은 빈도 계산에서 제외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-seasonality-input-unit",
      "stage": "selfcheck",
      "channel": "google",
      "when": "계절성 조정 제안의 입력값이 전환율 변화율이 아니거나, 동일 기간·동일 캠페인에 이미 조정이 존재",
      "metric": "seasonality_input_type, overlapping_adjustments",
      "condition": "seasonality_input_type != 'conversion_rate_change' OR overlapping_adjustments >= 1",
      "action": "제안 기각, 입력 단위 수정 또는 기존 조정 수정으로 대체",
      "guardrail": "기간 14일 초과는 google-seasonality-duration-check 규칙이 별도 차단",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-aug17-systemic-change",
      "stage": "selfcheck",
      "channel": "google",
      "when": "예산 제한 상태 tCPA/tROAS/Demand Gen tCPC 캠페인의 CPA 상승(ROAS 하락) 시작일이 2026-08-17 ±14일",
      "metric": "budget_limited, anomaly_start_date, bid_strategy_type",
      "condition": "budget_limited = true AND abs(anomaly_start_date - '2026-08-17') <= 14",
      "action": "systemic_change_suspected 플래그, 롤백 대신 Bid Target Adjustment Tool 기준 목표 재설정 검토로 라우팅",
      "guardrail": "예산 미제약 캠페인은 이 규칙 대상 제외",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-google-bidding-signal-validity",
      "section": "verify",
      "id": "verify-selfcheck-google-decision-sample-size",
      "stage": "selfcheck",
      "channel": "google",
      "when": "목표값 변경 판단의 근거 구간 전환수가 tCPA 30건 또는 tROAS 15건 미만",
      "metric": "conversions_in_evaluation_window, bid_strategy_type",
      "condition": "(type = 'tCPA' AND conv < 30) OR (type = 'tROAS' AND conv < 15)",
      "action": "'데이터 부족' 판정, 변경 보류, 구간 연장 후 재평가",
      "guardrail": "구간 연장은 최대 90일, 그 이상이면 사람 검토",
      "confidence": "medium"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-entity-lock-conflict",
      "when": "동일 엔티티(캠페인/그룹/광고)에 두 개 이상의 자동화 액션이 동시에 락을 요청",
      "metric": "concurrent_lock_conflict_count",
      "condition": "> 0",
      "action": "후행 요청을 큐잉하거나 거부, 선행 액션 완료까지 대기",
      "guardrail": "락 타임아웃(설계값 30분) 초과 시 좀비 락으로 간주해 강제 해제 후 알림",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-cross-channel-simultaneity",
      "when": "동일 브랜드의 서로 다른 채널 예산·입찰 변경 액션이 좁은 시간창(1시간) 내 중첩",
      "metric": "cross_channel_change_overlap_minutes",
      "condition": "< 60",
      "action": "후행 채널 액션을 지연 큐로 이동",
      "guardrail": "사전 승인된 동시 프로모션 태그가 있으면 예외 허용(우회 사유 로그 필수)",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-daily-action-total-cap",
      "when": "전 채널 합산 자동 실행 액션 수가 일 상한에 근접·초과",
      "metric": "total_actions_executed_today",
      "condition": ">= daily_action_cap",
      "action": "우선순위 낮은 대기 액션을 다음 배치로 연기",
      "guardrail": "롤백·킬스위치 관련 액션은 이 상한에서 제외(항상 즉시 실행)",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-post-action-rollback-window",
      "when": "액션 실행 후 관찰창(채널별 최대 어트리뷰션 지연+여유분) 내 핵심 지표가 악화 임계치 초과",
      "metric": "post_action_metric_delta",
      "condition": "> rollback_threshold",
      "action": "자동 롤백(직전 값으로 복원) 후 사람 알림",
      "guardrail": "관찰창 경과 후에는 자동 롤백 대신 사람 승인 요청으로 전환",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-human-approval-required-categories",
      "when": "액션이 예산총량상한초과·신규채널온보딩·개인정보타겟팅자산·표시광고법리스크소재 중 하나에 해당",
      "metric": "requires_human_approval",
      "condition": "== true",
      "action": "실행하지 않고 승인 대기 큐에 등록, 계획(before/after)을 사람에게 제시",
      "guardrail": "이 카테고리는 사람 승인 없이 자동 실행 경로로 우회 불가(하드 게이트)",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-audit-log-completeness",
      "when": "실행된 자동화 액션 레코드에 누가/언제/무엇을/이전값/이후값/근거규칙id 중 하나라도 누락",
      "metric": "audit_log_missing_field_count",
      "condition": "> 0",
      "action": "해당 액션을 미검증 실행으로 플래그, 반복 시 킬스위치 트리거 후보로 집계",
      "guardrail": "개인정보 포함 자산의 로그는 개인정보의 안전성 확보조치 기준 제8조 기준 원칙 1년 이상(5만명 이상 정보주체·고유식별정보/민감정보 처리·기간통신사업자는 2년 이상) 보관, 임의 삭제 금지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-kill-switch-trigger",
      "when": "계정정지·거부급증, 동일 엔티티 24시간 내 롤백 3회 이상, 감사로그 기록 실패, 예산가드레일 다중위반 중 하나 발생",
      "metric": "kill_switch_trigger_signal",
      "condition": "== true",
      "action": "전 채널 자동화 즉시 중단(신규 액션 생성·실행 모두 정지), 사람에게 긴급 알림",
      "guardrail": "재개는 원인조사 완료 후 사람의 수동 해제로만 가능, 시스템 자동 재개 금지",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-action-safety-compliance",
      "section": "verify",
      "id": "verify-selfcheck-common-ad-law-disclosure-filter",
      "when": "자동 세팅·수정이 건드리는 소재·확장소재·랜딩페이지 문구에 협찬표시 누락(추천·보증 등에 관한 표시·광고 심사지침 기준 미인정 문구·위치), 근거없는 최상급·효능효과 단정, 부당비교·비방 표현 후보 감지",
      "metric": "ad_law_risk_flag_count",
      "condition": "> 0",
      "action": "자동승인 경로에서 제외하고 사람 검수 큐로 이동, 감지 근거(패턴)를 함께 기록",
      "guardrail": "협찬표시 판정은 FTC 고시 기준(제목/첫부분·본문과 구분되는 크기색상·해시태그 첫번째 위치·'#광고'류 한국어 명확 문구만 인정, '체험단'·외국어단독표기·댓글삽입은 불인정)을 그대로 적용, 오탐 방지를 위해 최종 게재 차단이 아닌 사람 검수 전환만 수행(자동 삭제·중단 금지)",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-lookback-cap-min-across-channels",
      "when": "다채널 통합 배치가 여러 채널의 데이터를 동시에 조회",
      "metric": "requested_lookback_days",
      "condition": "> min(channel_report_window_cap_days)",
      "action": "요청 기간을 참여 채널 중 최소 조회 상한으로 절단 후 재요청",
      "guardrail": "채널별 상한 표는 각 verify-setup-* 문서 갱신 시 함께 갱신, 하드코딩 값 단독 신뢰 금지",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-timezone-missing",
      "when": "채널 리포트 레코드에 타임존/오프셋 정보가 없거나 KST 변환에 실패",
      "metric": "timezone_normalize_failure_count",
      "condition": "> 0",
      "action": "해당 배치의 판정을 보류하고 원본 타임존 재확인 알림",
      "guardrail": "임의로 UTC=KST 로 가정하고 진행 금지",
      "confidence": "low",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-data-staleness",
      "when": "채널 last_synced_at 과 판정 실행시각 간격이 신선도 임계치를 초과",
      "metric": "data_staleness_hours",
      "condition": "> 6",
      "action": "해당 채널 데이터를 판정에서 제외하고 부분 데이터 배지 표시",
      "guardrail": "제외 채널이 참여 채널의 50% 초과 시 배치 전체를 보류. 6시간 임계치는 네이버 공식 최대 반영지연(파워링크 4시간)보다 여유를 둔 설계값(FAQ/442)",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-min-sample-fallback",
      "when": "채널이 공식 학습단계·최소전환 신호를 제공하지 않는 지표를 판정",
      "metric": "sample_conversions_window",
      "condition": "< 30 OR window_days < 7",
      "action": "판정을 표본부족으로 보류, 예산·입찰·타겟 변경 액션 생성 금지",
      "guardrail": "채널 공식 신호(learning_stage_info 등)가 있으면 이 규칙보다 그 신호를 우선. NIST 표본크기 핸드북(prc222/prc33)은 고정 '30'을 규정하지 않고 산식 기반 산정과 소표본 시 Fisher's Exact Test 대안만 명시 — 30·7일은 이를 대신하는 실무 근사치(설계값). 구글 입찰전략 학습상태(bid strategy status)도 고정 전환수·일수가 아닌 4가지 정성적 사유(신규전략/설정변경/구성변경/광고그룹타겟변경)로만 판정하며 유일한 공식 정량치는 학습기간 '최대 3주 또는 1~2 전환주기' — 30건·7일이 구글 공식 규칙이라는 오인 방지용 출처 병기[Google-입찰상태, Google-학습기간]",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-anomaly-zscore-fallback",
      "when": "공식 이상치·상태 신호가 없는 지표에서 이동 z-score 기반 이상치 후보 발생",
      "metric": "rolling_zscore_abs",
      "condition": "> 3",
      "action": "이상치 후보로 표시, 한국 공휴일 캘린더와 대조해 계절성이면 무시하고 아니면 알림",
      "guardrail": "z=3 임계치는 NIST 관리도 핸드북의 3-시그마 산업표준(정규분포 이탈확률 약 0.3%)에 근거하며[NIST-pmc32], 채널 공식 상태 신호를 대체하지 않음",
      "confidence": "high",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-daily-total-budget-guardrail",
      "when": "브랜드·계정 합산 일 예산 총액이 사람이 지정한 상한을 초과",
      "metric": "total_daily_spend_all_channels",
      "condition": "> approved_daily_cap",
      "action": "신규 예산 증액 액션 전면 차단, 기존 진행 캠페인 예산은 유지, 사람 알림",
      "guardrail": "approved_daily_cap 값 자체는 엔진이 수정 불가, 사람 승인으로만 변경",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-weekly-budget-growth-cap",
      "when": "브랜드 합산 주간 총예산이 전주 대비 설계 상한을 초과해 증가",
      "metric": "weekly_budget_growth_ratio",
      "condition": "> 1.5",
      "action": "상한 초과분 증액 액션을 보류하고 사람 승인 요청",
      "guardrail": "성수기·프로모션 등 사전 승인된 예외 태그가 있으면 우회 가능(우회 사유 로그 필수). 1.5(+50%)라는 숫자 자체는 여전히 저장소 설계값이지만, 메타 공식문서(Significant Edits and Learning Phase)가 예산 변경 학습재시작 기준을 '%가 아닌 변경 크기(magnitude)'로만 규정하고 +1%는 안전·+900%는 위험 예시를 든다는 사실은 공식 확인됨[Meta-유의미수정] — +50%는 이 넓은 안전~위험 구간 사이에 있는 보수적 값",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-selfcheck-common-data-budget-guardrail",
      "section": "verify",
      "id": "verify-selfcheck-common-rate-limit-dynamic-backoff",
      "when": "채널 API가 429 또는 유사 속도제한 응답을 반환(예: 네이버는 계정단위 동적 제한만 공개)",
      "metric": "http_429_count_5min",
      "condition": "> 0",
      "action": "Retry-After/지수 백오프로 재시도, 5분 내 3회 이상 반복 시 해당 채널 자동화 일시 중단",
      "guardrail": "고정 QPS 하드코딩 금지, 채널별 응답 신호를 항상 우선",
      "confidence": "medium",
      "stage": "selfcheck",
      "channel": "common"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-evidence-link-missing",
      "when": "제안 객체에 근거 소재 ID 또는 stat 정량 지표(ctr/crto/convAmt 등)가 없음",
      "metric": "evidence_ad_ids, evidence_metrics",
      "condition": "count(evidence_ad_ids) = 0 OR evidence_metrics IS NULL",
      "action": "제안 기각, 근거 필드 보강 후 재생성 요청",
      "guardrail": "근거 없는 제안은 세팅 단계 전달 금지",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-evidence-lookback-cap",
      "when": "근거 산출 lookback이 리포트 유형별 상한(AD 365/AD_DETAIL 180/AD_CONVERSION 365/AD_CONVERSION_DETAIL 45/일반 92일) 초과",
      "metric": "evidence_lookback_days",
      "condition": "evidence_lookback_days > max_days_by_report_type[report_type]",
      "action": "해당 근거 무효 처리, 상한 이내로 재조회 후 재생성",
      "guardrail": "report_type 매핑값은 FAQ-stat 개정 시에만 수정",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-sample-insufficient",
      "when": "변형(variant)별 근거 표본이 전환 20건 미만이면서 노출 1,000회 미만, 관측기간 7일 미만",
      "metric": "variant_conversions, variant_impressions, variant_days",
      "condition": "variant_conversions < 20 AND variant_impressions < 1000 AND variant_days < 7",
      "action": "제안 등급 unproven으로 강등, 자동 세팅 전달 차단",
      "guardrail": "전환 20건/노출 1,000회 기준은 공식 근거 없는 설계값(2026-08-23 재확인, confidence low 유지 — 메타의 '약 50 results/주'는 지표 정의가 달라 직접 대입 불가). 관측기간 7~14일 하한은 네이버 자동입찰 도움말('설정 후 1~2주 관리 권장')·구글애즈 학습기간('최대 3주 또는 1~2 전환주기')·메타 학습단계('마지막 유의미한 수정 후 1주일 내 약 50건')가 1~3주 범위로 3곳 교차 확인되어 confidence medium에서 high로 상향(2026-08-23)",
      "confidence": "low",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-evidence-unapproved-period",
      "when": "근거 관측기간 중 해당 소재의 inspectStatus가 APPROVED/ELIGIBLE이 아니었던 일수 비중이 50% 이상",
      "metric": "unapproved_period_ratio",
      "condition": ">= 0.5",
      "action": "해당 근거 폐기, 승인 상태 구간만 재추출하여 재계산",
      "guardrail": "폐기 여부 로그에 원본 inspectStatus 이력 보존",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-powerlink-qi-invalid-evidence",
      "when": "TEXT_45(파워링크) 키워드의 nccQi를 카피 개선 근거·비교 지표로 인용(2026-07-29 이후 시점 데이터)",
      "metric": "cites_powerlink_qi_as_evidence",
      "condition": "== true",
      "action": "해당 근거 무효 처리, adRelevanceScore/expectedClickScore 또는 stat 지표로 대체 요구",
      "guardrail": "쇼핑형 nccQi.qiGrade(1~7)는 예외로 계속 허용",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-multi-variable-test",
      "when": "제안이 동시에 바꾸는 요소(헤드라인·설명·랜딩URL·확장소재)가 2종 이상",
      "metric": "changed_field_count",
      "condition": "> 1",
      "action": "교란 변수 플래그, 요소별 분리 제안으로 재생성",
      "guardrail": "분리 불가 사유(예: URL 변경에 설명 수반) 기록 시 예외",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-rsa-pin-blocks-test",
      "when": "RSA_AD 테스트 제안 대상 자산(AdAssetRequest)에 pin 값이 설정돼 있음",
      "metric": "rsa_asset_pin_set",
      "condition": "== true",
      "action": "테스트 시작 전 pin 해제 요청 또는 '고정 조합 기반' 라벨을 붙여 별도 분류",
      "guardrail": "고객이 의도적으로 고정한 pin은 세팅 단계 승인 없이 자동 해제 금지",
      "confidence": "medium",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-copy-spec-precheck",
      "when": "제안 카피가 headline 1~15자 또는 description 20~45자 범위를 벗어나거나 허용 문자셋 밖 문자를 포함하거나 {keyword:} 치환이 헤드라인+설명 합산 4회 초과",
      "metric": "headline_len, description_len, charset_valid, keyword_insert_count",
      "condition": "headline_len NOT IN [1,15] OR description_len NOT IN [20,45] OR charset_valid == false OR keyword_insert_count > 4",
      "action": "테스트 큐 진입 차단, 규격 위반 사유(예상 에러 3906/3913)와 함께 재생성 요청",
      "guardrail": "규격 재검증 없이 세팅 단계로 전달 금지",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-evidence-testing",
      "section": "verify",
      "id": "verify-propose-naver-control-group-retained",
      "when": "테스트 시작 시점에 대상 그룹의 승인(APPROVED/ELIGIBLE) 소재 수가 신규 제안 소재를 제외하고 0개",
      "metric": "approved_control_ad_count",
      "condition": "== 0",
      "action": "테스트 시작 보류, 기존 승인 소재 최소 1개를 대조군으로 유지하도록 순서 조정",
      "guardrail": "대조군 없이 전량 교체 테스트 금지(4703 위험)",
      "confidence": "medium",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-medical-type-mismatch",
      "when": "제안 카피가 의료·시술·효능 관련 표현을 포함하는데 소재 type이 MEDICAL_AD가 아님",
      "metric": "contains_medical_claim, ad_type",
      "condition": "contains_medical_claim == true AND ad_type != 'MEDICAL_AD'",
      "action": "업종-타입 불일치 플래그, MEDICAL_AD 재분류 또는 사유 기록 요청",
      "guardrail": "자동으로 type을 변경하지 않고 사람 확인 요청만 발행",
      "confidence": "medium",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-policy-risk-pattern",
      "when": "제안 카피에서 과장 효능(최상급·비교·공인/수상·순위/점유율 포함)·허위 희소성·가격 불일치·개인 속성 단정 표현 패턴 탐지",
      "metric": "policy_risk_hits",
      "condition": ">= 1",
      "action": "'정책 의심' 등급 부여, 사람 확인 전 세팅 단계 전달 차단",
      "guardrail": "최상급/비교/공인·지정·선정·수상/순위·점유율·확률 문구는 네이버 광고 검수 기준이 공식으로 소명자료(공신력 있는 서류) 요구를 규정함(confidence medium, 출처: 광고검수기준-차별적표현); 허위 희소성·가격 불일치·개인 속성 단정은 표시광고법 제3조 1호(거짓·과장)·2호(기만적 표시·광고)의 일반원칙에 해당할 여지가 법률 원문으로 확인됐으나(2026-08-23, 법제처 Open API) 구체 판정기준(시행령)은 미확보 — confidence low에서 medium으로 소폭 상향, 탐지 규칙 자체는 설계값 유지. 자동화는 의심까지만 판단, 최종 반려·승인 확정 금지",
      "confidence": "medium",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-disclosure-missing-sponsorship",
      "when": "광고주-추천인 간 경제적 이해관계(협찬·체험단·원고료·포인트·할인)가 있는 오퍼인데 카피·해당 확장소재에 공식 기준 고지 문구('경제적 대가를 받았음', '협찬받음', '광고입니다', '#광고', '#협찬' 등)가 없거나 부적절 문구('체험단', '체험 후기', '선물', 단순 브랜드 해시태그, 영문 단독표기)만 있음",
      "metric": "sponsorship_disclosure_valid",
      "condition": "== false",
      "action": "세팅 단계 전달 차단, 공식 문구 예시로 재생성 요구",
      "guardrail": "공정위 예규 「추천ㆍ보증 등에 관한 표시ㆍ광고 심사지침」(499호, 2026-06-01 시행) 원문으로 적절/부적절 문구·위치·형식 기준을 전부 확인함(2026-08-23, 법제처 Open API) — 고지 문구 자동 삽입은 금지, 사람이 최종 문구 확정",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-disclosure-missing-subscription",
      "when": "할인 기간·조건 또는 정기결제(구독) 여부 등 오퍼 고지 요소가 카피·해당 확장소재 유형에 반영되지 않음(설계값 체크리스트)",
      "metric": "required_disclosure_present",
      "condition": "== false",
      "action": "'법무 확인' 라벨 부여, 승인 대기열 등록",
      "guardrail": "고지 문구 자동 삽입 금지, 사람이 최종 문구 확정. 정기결제 고지 요건은 추천보증심사지침의 적용범위 밖(추천·보증에 한정)으로 확인됐으며, 2026-08-23 재조사에서도 law.go.kr·ftc.go.kr에서 이 항목의 공식 근거를 확보하지 못함 — 체크리스트 자체가 설계값",
      "confidence": "low",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-inspect-context-missing",
      "when": "규제·민감 업종으로 분류된 제안이 AdKeyword 또는 AdExtensionRequest 경로로 등록 예정인데 inspectRequestMsg가 비어 있음",
      "metric": "inspect_request_msg_present",
      "condition": "== false",
      "action": "세팅 단계 요구사항에 inspectRequestMsg 작성(근거·기간·심의번호 등) 추가",
      "guardrail": "Ad(소재 본문) 자체에는 이 필드가 없으므로 소재는 3823/3914 재검토 경로로 별도 처리",
      "confidence": "medium",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-duplicate-content-precheck",
      "when": "제안 카피가 최근 등록 이력과 문자열 유사도 높아 3822(동일 내용 소재 존재) 반려가 예상됨",
      "metric": "copy_similarity_to_recent",
      "condition": ">= 0.9",
      "action": "중복 기각, 차별 요소(오퍼·CTA·랜딩) 명시 요구",
      "guardrail": "3822 에러코드 자체는 공식 확인(에러코드맵, '같은 내용의 소재가 이미 등록되어 있습니다'). 유사도 임계값 0.9는 네이버의 실제 판정 알고리즘·임계치가 공개돼 있지 않아(2026-08-23 재확인, 고정값 없음) 여전히 설계값, 재검증 대상",
      "confidence": "low",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-rereview-only-disapproved",
      "when": "정상 노출(ELIGIBLE) 또는 심사대기(UNDER_REVIEW) 상태의 소재를 대상으로 '재심사 요청' 액션이 포함된 제안 생성",
      "metric": "target_ad_status, action_type",
      "condition": "target_ad_status NOT IN ['DISAPPROVED','LIMITED_ELIGIBLE'] AND action_type == 'reinspect_request'",
      "action": "재심사 요청 액션 제거, 3823/3914 회피를 위해 '신규 소재 교체' 액션으로 전환",
      "guardrail": "재검토는 노출제한(반려) 상태 소재에서만 유효(공식 에러코드 3823/3914)",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-repeat-rejection-escalation",
      "when": "동일 parent_proposal_id 제안이 심사에서 2회 연속 반려(DISAPPROVED/DENIED)",
      "metric": "consecutive_rejection_count",
      "condition": ">= 2",
      "action": "자동 재생성 중단, 반려 사유 원문 첨부 후 사람 에스컬레이션",
      "guardrail": "재심사 재시도 횟수 제한이나 반복 반려 페널티 정책은 API FAQ·에러코드맵에 없음(2026-08-23 재확인, 공식 근거 없음) — '2회' 문턱은 설계값. 3회째 시도부터는 사유 원문 없이 재생성 금지",
      "confidence": "medium",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-naver-policy-approval-rollback",
      "section": "verify",
      "id": "verify-propose-naver-human-approval-gate",
      "when": "정책 의심·업종 불일치·고지 누락·중복 위험 플래그 중 1개 이상이 해소되지 않은 채 세팅 단계 전달 시도",
      "metric": "unresolved_policy_flags",
      "condition": ">= 1",
      "action": "세팅 단계 전달 차단, 승인 대기열 등록",
      "guardrail": "승인자 식별자·승인 시각 기록 없이는 게이트 해제 불가",
      "confidence": "high",
      "stage": "propose",
      "channel": "naver"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-superlative-claim-no-evidence",
      "when": "제안 카피에 최상급/수상/인증 표현이 있는데 조사기간·인증기관 등 증빙 필드가 없음",
      "metric": "superlative_pattern_hit, evidence_fields_present",
      "condition": "superlative_pattern_hit = true AND evidence_fields_present < 2",
      "action": "카피 생성 차단, 증빙 필드 입력 요청 또는 표현 제거 대안 제시",
      "guardrail": "지면 제약 시 최소 조사기간+인증기관 2요소는 필수",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-explicit-content-flag",
      "when": "제안 카피·이미지 설명에서 과도한 신체노출·음란·선정·외설 표현 패턴 탐지",
      "metric": "explicit_content_hits",
      "condition": ">= 1",
      "action": "'정책 위반 의심' 라벨, 재생성 요청",
      "guardrail": "자동화는 의심까지만 판단, 최종 심사는 쿠팡 검수",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-copyright-risk",
      "when": "제안이 라이선스 미확인 제3자 이미지·문구를 참조 소재로 사용",
      "metric": "license_verified",
      "condition": "== false",
      "action": "해당 참조 소재 생성 차단, 자체 제작 대체 요구",
      "guardrail": "라이선스 확인 전까지 세팅 단계 전달 금지",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-delivery-keyword-proposed",
      "when": "신규 키워드 제안에 배송조건 키워드(무료배송/당일배송/로켓배송) 포함",
      "metric": "delivery_condition_keyword_flag",
      "condition": "== true",
      "action": "해당 키워드를 제안 목록에서 제외",
      "guardrail": "실제 배송조건과 일치해도 예외 없음",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-keyword-detail-page-mismatch",
      "when": "신규 키워드 제안이 상품 상세페이지 텍스트에서 확인되지 않거나 상품과 관련성이 낮음",
      "metric": "detail_page_evidence_found, relevance_score",
      "condition": "detail_page_evidence_found = false OR relevance_score < threshold(설계값)",
      "action": "해당 키워드를 제안 목록에서 제외",
      "guardrail": "관련성 임계값 자체는 쿠팡 비공개 — 설계값(제안), 오탐 시 사람 검토로 복구 가능. 공식·업계 근거 없음(2026-08-23 재조사: policy/·Faq.html·faq 확인, 쿠팡은 '상세페이지에서 확인 가능하고 관련 있는' 키워드만 요구할 뿐 정량 임계값을 공개하지 않음). detail_page_evidence_found=false(상세페이지 미확인) 조건은 policy/ 요건을 직접 반영해 confidence 유지 대상이나, relevance_score 수치 임계값 부분만 설계값. 2026-08-23 2차 재조사: 네이버도 '관련성 낮은 키워드' 자체는 공식 제한 사유로 명시하지만(ads.naver.com/help/faq/393) 정량 점수 기준은 마찬가지로 비공개 — 관련성 요건의 존재는 교차확인, 임계값 수치는 여전히 근거 없음",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-food-labeling-law",
      "when": "대상 카테고리가 식품·건강기능식품인데 제안 카피에 표시광고법 필수 고지 문구가 없음",
      "metric": "category, required_disclosure_present",
      "condition": "category IN ['식품','건강기능식품'] AND required_disclosure_present = false",
      "action": "'법무 확인' 라벨 부여, 자동 확정 금지",
      "guardrail": "고지 문구 자동 삽입 금지, 사람이 확정. 상위 법령: 식품 등의 표시·광고에 관한 법률 제8조(질병예방·치료 오인, 의약품 오인, 건강기능식품 오인, 거짓·과장, 기만, 부당비교 표시·광고 금지) — 법령정보센터 확인(시행 2025-09-19)",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-no-autonomous-execution",
      "when": "제안 실행 단계에서 execution_mode가 human_manual이 아님",
      "metric": "execution_mode",
      "condition": "!= 'human_manual'",
      "action": "자동 실행 시도 차단, 해당 세션 제안 전량 무효화",
      "guardrail": "공식 API 부재 — 매크로/RPA 대행 입력도 금지",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-review-lead-time-insufficient",
      "when": "제안의 목표 게재일까지 남은 영업일이 검수 소요 기준(일반 2영업일, MADA 7영업일) 미만",
      "metric": "business_days_to_launch",
      "condition": "< 2",
      "action": "목표 게재일을 검수 소요만큼 재조정 제안 또는 지연 리스크 고지",
      "guardrail": "MADA 구좌는 7영업일 기준을 우선 적용(`verify-analyze-coupang-policy-creative-safety`)",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-compliance-approval",
      "section": "verify",
      "id": "verify-propose-coupang-approval-record-missing",
      "when": "제안이 setup 단계로 전달되는데 승인자 식별자 또는 승인 시각이 기록되지 않음",
      "metric": "approver_id, approved_at",
      "condition": "approver_id IS NULL OR approved_at IS NULL",
      "action": "setup 단계 전달 차단, 승인 대기열 유지",
      "guardrail": "승인 기록 없이 상태를 'setup 전달완료'로 표시 금지",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-evidence-link-missing",
      "when": "제안 객체에 근거 캠페인/키워드/상품 ID 또는 정량 지표(계정·카테고리 평균 대비)가 없음",
      "metric": "evidence_ids_count, evidence_metrics_present",
      "condition": "evidence_ids_count = 0 OR evidence_metrics_present = false",
      "action": "제안 기각, 근거 필드 보강 후 재생성 요청",
      "guardrail": "근거 없는 제안은 사람 실행 대기열에 올리지 않는다",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-attribution-window-immature-evidence",
      "when": "제안 근거 구간의 조회 종료일이 오늘 기준 14일 이내",
      "metric": "evidence_end_date",
      "condition": "evidence_end_date > today - 14d",
      "action": "근거를 '잠정'으로 표시, 확정 근거 구간 추가 없이는 제안 확정 보류",
      "guardrail": "전환 귀속 14일 이전 구간을 확정 근거로 사용 금지",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-optimization-lock-evidence",
      "when": "근거로 쓰인 캠페인/그룹의 목표 광고수익률·예산 변경 시점이 14일 이내",
      "metric": "days_since_last_setting_change",
      "condition": "< 14",
      "action": "해당 구간을 '최적화 중'으로 표기하고 성과 결론·제안 근거에서 제외",
      "guardrail": "최적화 기간 데이터로 재변경 제안 생성 금지",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-sample-insufficient",
      "when": "근거 구간 누적 클릭 30회 미만 또는 노출 1,000회 미만",
      "metric": "evidence_clicks, evidence_impressions",
      "condition": "evidence_clicks < 30 OR evidence_impressions < 1000",
      "action": "제안 등급을 '표본 부족(참고용)'으로 강등, 사람 실행 대기열 자동 전달 금지",
      "guardrail": "임계값(클릭30/노출1,000)은 쿠팡 공식 기준이 없는 설계값(제안), 카테고리별 조정 가능. 메타(약 50건/1주)·네이버(224개 공지 전수 확인해도 자동입찰 최소 표본 비공개)도 정확히 같은 수치를 공개하지 않아 '표본 하한을 두는 관행'은 교차확인됐지만 쿠팡 특정 숫자의 공식 근거는 없음(2026-08-23 2차 재조사)",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-root-cause-checklist-skipped",
      "when": "저조 성과를 근거로 입찰가 인하·소재 교체를 제안하면서 상세페이지·리뷰·가격 경쟁력 점검 결과가 첨부되지 않음",
      "metric": "root_cause_checked",
      "condition": "== false",
      "action": "원인 분류 점검 결과 첨부 요구, 미첨부 시 '원인 오귀속 위험' 경고 라벨 부여",
      "guardrail": "점검 없이 입찰가 인하만 반복 제안하는 패턴은 우선순위 하향",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-fraud-tainted-evidence",
      "when": "제안 근거 구간이 부정클릭 급증 플래그 기간과 겹침",
      "metric": "evidence_period_fraud_flagged",
      "condition": "== true",
      "action": "해당 구간 지표를 근거에서 제외, 정상 구간만으로 재산정",
      "guardrail": "부정클릭 탐지·무효클릭 처리는 쿠팡이 선행 — 프로그램은 근거 오염만 차단",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-multi-variable-test",
      "when": "테스트 제안이 동시에 바꾸는 변수(입찰가·소재·키워드)가 2개 이상이거나 대조군이 없음",
      "metric": "changed_variable_count, has_control_group",
      "condition": "changed_variable_count > 1 OR has_control_group = false",
      "action": "변수별 분리 제안으로 재생성 요청",
      "guardrail": "쿠팡 자체 A/B 테스트 도구 부재로 '변수 1개·변형 2개'라는 구체 설계는 설계값(제안). 다만 메타 공식 '유의미한 수정' 문서가 타겟팅·크리에이티브·최적화이벤트·입찰전략을 각각 독립적 재학습 트리거로 분류해 변수 분리 원칙의 방법론적 정당성을 교차확인함(2026-08-23 2차 조사, facebook.com/business/help/316478108955072)",
      "confidence": "medium",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-test-duration-under-14d",
      "when": "테스트 제안의 승/패 판정 요청 시점까지 집행 경과일이 14일 미만",
      "metric": "test_running_days",
      "condition": "< 14",
      "action": "판정 보류, 14일 경과 후 재판정 예약",
      "guardrail": "전환 귀속 14일을 채우지 않은 조기 판정 금지 — 14일은 공식 전환 귀속 기간(analysis/03, faq)의 직접 적용",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-coupang-evidence-testing",
      "section": "verify",
      "id": "verify-propose-coupang-budget-cut-below-spent",
      "when": "예산 축소 제안값이 해당일 이미 소진된 광고비보다 낮음",
      "metric": "proposed_daily_budget, spend_today",
      "condition": "proposed_daily_budget < spend_today",
      "action": "당일 적용 대신 '다음날부터 적용'으로 제안 자동 변환",
      "guardrail": "쿠팡은 당일 소진액 이하로 예산을 낮출 수 없음",
      "confidence": "high",
      "stage": "propose",
      "channel": "coupang"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-spec-mismatch",
      "stage": "propose",
      "channel": "meta",
      "when": "제안 포맷의 비율·길이가 대상 배치 규격(릴스/스토리 9:16·최대 90초, 피드 4:5 또는 1:1)과 불일치하거나 규격 필드 누락",
      "metric": "aspect_ratio, duration_sec, placements",
      "condition": "aspect_ratio NOT IN allowed(placements) OR (placements CONTAINS 'reels' AND duration_sec > 90) OR (placements CONTAINS 'stories' AND duration_sec > 60) OR aspect_ratio IS NULL",
      "action": "규격 위반 플래그, 배치별 규격 보강 후 재생성",
      "guardrail": "가로형(16:9) 제안은 사유 명시 없이는 통과 금지. 릴스 90초/스토리 60초는 배치별로 다르게 적용(2026-08-23 benly 재확인, 이전 버전은 두 배치에 90초를 동일 적용한 오류)",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-safezone-missing",
      "stage": "propose",
      "channel": "meta",
      "when": "릴스/스토리 제안에 세이프존(하단 약 18%, 1920px 기준 340px UI 구간) 회피 지시가 없거나 CTA·핵심 텍스트를 해당 구간에 배치하도록 지시",
      "metric": "safezone_instruction, text_in_bottom_zone",
      "condition": "safezone_instruction = false OR text_in_bottom_zone = true",
      "action": "세이프존 지시 추가 요구",
      "guardrail": "세이프존 수치는 2026-08-23 benly 재확인 결과 하단 약 340px(≈18%)로 확정. 이전 버전의 '20~35% 상충, 보수적 35% 적용'은 근거가 재확인되지 않아 폐기",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-hook-over-125",
      "stage": "propose",
      "channel": "meta",
      "when": "제안 카피의 헤드라인이 25자 또는 기본 텍스트(본문)가 90자를 넘김",
      "metric": "headline_char_count, primary_text_char_count",
      "condition": "headline_char_count > 25 OR primary_text_char_count > 90",
      "action": "길이 초과 플래그, 카피 재생성 요구",
      "guardrail": "한국어는 글자 수 기준으로 계산. 25자(헤드라인)·90자(본문)는 2026-08-23 2라운드 재조사로 Meta Marketing API 공식 AdCreative 레퍼런스(제한 사항>필드 수준 제한, v26.0)에서 '권장(recommended)' 값으로 확인됨(공식 문서, id명은 이전 '125' 명칭을 유지하되 값은 갱신). 종전 '125자' 업계 통설은 770agency·공식 문서 어디에도 근거가 없어 폐기. 권장치가 하드 리밋인지 여부(초과 시 API 거부 vs 노출만 저하)는 미확인",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-video-no-caption",
      "stage": "propose",
      "channel": "meta",
      "when": "영상 제안에 자막 포함 지시가 없음",
      "metric": "caption_instruction",
      "condition": "= false",
      "action": "자막 지시 추가",
      "guardrail": "알림만, 기각 아님. 자막 필수 규칙은 사내 설계값(제안) — 2026-08-23 770agency 원문에서 확인되지 않음",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-policy-risk-pattern",
      "stage": "propose",
      "channel": "meta",
      "when": "개인 속성 지칭·비포/애프터·효능 보장·허위 희소성·가격 불일치 등 정책 고위험 패턴 탐지",
      "metric": "policy_risk_hits",
      "condition": ">= 1",
      "action": "'정책 의심' 등급, 사람 확인 전 제작 지시 차단",
      "guardrail": "자동화는 의심까지만 판단, 최종 판정은 사람",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-restricted-vertical",
      "stage": "propose",
      "channel": "meta",
      "when": "의료·건강기능식품·금융·주류·도박·정치 키워드 또는 필수 고지(협찬·심의·할인 조건) 누락 탐지",
      "metric": "restricted_vertical_hits, required_disclosure_missing",
      "condition": "restricted_vertical_hits >= 1 OR required_disclosure_missing = true",
      "action": "'법무 확인' 라벨, 승인 대기열 등록",
      "guardrail": "고지 문구 자동 삽입 금지, 사람이 확정",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-brand-guide-violation",
      "stage": "propose",
      "channel": "meta",
      "when": "제안 카피·비주얼 지시가 브랜드 금칙어·톤·로고 사용 규정과 불일치",
      "metric": "brand_rule_violations",
      "condition": ">= 1",
      "action": "위반 항목 표기 후 수정 제안",
      "guardrail": "브랜드 가이드 미등록 계정은 규칙 건너뜀(경고 1회)",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-duplicate-proposal",
      "stage": "propose",
      "channel": "meta",
      "when": "제안의 (훅 유형·각도·포맷·길이 구간) 튜플이 기존 집행/대기 소재와 동일하거나 카피 유사도 0.9 이상",
      "metric": "tag_tuple_match, copy_similarity",
      "condition": "tag_tuple_match = true OR copy_similarity >= 0.9",
      "action": "중복 기각, 차별 요소 명시 요구",
      "guardrail": "parent_creative_id가 명시된 의도적 변형은 예외",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-advantage-enhancement-confound",
      "stage": "propose",
      "channel": "meta",
      "when": "근거 소재에 Advantage+ 크리에이티브 표준 개선이 적용돼 있는데 제안이 카피 문구·이미지 톤을 승자 속성으로 인용",
      "metric": "evidence_enhancements_applied, cites_copy_or_visual_attr",
      "condition": "evidence_enhancements_applied = true AND cites_copy_or_visual_attr = true",
      "action": "속성 신뢰도 한 단계 하향, 원본/변형 구분 불가 표기",
      "guardrail": "개선 적용 여부 미상이면 미상으로 기록, 적용 안 됨으로 간주 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-enhancement-control-required",
      "stage": "propose",
      "channel": "meta",
      "when": "제안이 세이프존 정밀 배치·브랜드 폰트/색 고정 등 정밀 제어를 요구하는데 표준 개선 해제 요구사항이 없음",
      "metric": "requires_precise_control, enhancement_optout_requested, data_justification_attached",
      "condition": "requires_precise_control = true AND (enhancement_optout_requested = false OR data_justification_attached = false)",
      "action": "세팅 단계 전달 항목에 해당 개선 옵션 해제 요구 + 성과 데이터 근거 첨부 요구 추가",
      "guardrail": "전체 개선 일괄 해제 금지, 충돌 항목만 지정. 2026-08-23 2라운드 정정: jonloomer 원문(리더 프록시로 재확보) 실제 논조는 '기본값(Advantage+ 개선) 우선 유지, 이탈 시에만 데이터 근거 요구'로 종전 '자동화는 항상 광고주가 검토·제어' 가정과 반대에 가까움 — 해제 요구는 반드시 데이터 근거를 동반해야 함",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-compliance",
      "section": "verify",
      "id": "verify-propose-meta-catalog-format-rule-mismatch",
      "stage": "propose",
      "channel": "meta",
      "when": "카탈로그/다이내믹 소재 대상 제안에 단품 영상용 규칙(훅 3초·홀드율 등)이 적용됨",
      "metric": "creative_type, applied_rule_set",
      "condition": "creative_type = 'catalog' AND applied_rule_set = 'single_video'",
      "action": "규칙 세트 분기 오류 플래그, 카탈로그용 규칙으로 재검증",
      "guardrail": "포맷 유형 미상 소재는 검증 보류",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-evidence-link-missing",
      "stage": "propose",
      "channel": "meta",
      "when": "제안 객체에 근거 소재 ID 또는 속성별 정량 지표(CTR·훅률·홀드율·CPA)가 없음",
      "metric": "evidence_creative_ids, attribute_metrics",
      "condition": "count(evidence_creative_ids) = 0 OR attribute_metrics IS NULL",
      "action": "제안 기각, 근거 필드 보강 후 재생성 요청",
      "guardrail": "근거 없는 제안은 세팅 단계 전달 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-winner-attr-not-superior",
      "stage": "propose",
      "channel": "meta",
      "when": "제안이 '승자 속성'으로 지목한 태그의 소재군 성과가 계정 평균 대비 우위가 아님",
      "metric": "attribute_ctr_lift, attribute_cpa_lift",
      "condition": "attribute_ctr_lift <= 0 AND attribute_cpa_lift >= 0",
      "action": "승자 속성 판정 오류 플래그, 속성 재집계",
      "guardrail": "단일 소재 1개의 성과로 속성 우위 주장 금지(소재 2개 이상)",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-sample-insufficient",
      "stage": "propose",
      "channel": "meta",
      "when": "근거 소재군 누적 전환 50회 미만이고 집행 7일 미만",
      "metric": "evidence_conversions, evidence_days_running",
      "condition": "evidence_conversions < 50 AND evidence_days_running < 7",
      "action": "제안 등급을 unproven으로 강등, 자동 세팅 차단",
      "guardrail": "훅률·홀드율 집계는 노출 1,000회 이상 소재만 포함",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-fatigue-signal-weak",
      "stage": "propose",
      "channel": "meta",
      "when": "교체 제안의 피로도 신호(빈도 콜드>3.0/리타겟>4.0, CTR 7일 -10%, 소재 나이 ≥21일) 충족 수가 1개 이하",
      "metric": "fatigue_signal_count",
      "condition": "<= 1",
      "action": "'교체 제안'을 '관찰'로 하향, 근거 보강 요청",
      "guardrail": "CPA가 목표 이내인 소재는 빈도 단독으로 교체 제안 금지. 콜드 빈도 임계값은 2026-08-23 adamigo 원문 기준 2.5→3.0으로 정정(위험선은 3.5). 소재 나이 21일은 원문 미확인 설계값",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-multi-variable-test",
      "stage": "propose",
      "channel": "meta",
      "when": "제안이 동시에 바꾸는 변수(훅·포맷·길이·메시지·CTA)가 2개 이상이거나 변형이 3개가 아님 또는 포맷 혼합",
      "metric": "changed_variable_count, variant_count, format_mixed",
      "condition": "changed_variable_count > 1 OR variant_count != 3 OR format_mixed = true",
      "action": "교란 변수 플래그, 변수별 분리 제안으로 재생성",
      "guardrail": "변수 분리 불가(예: 포맷 전환에 길이 수반)는 사유 기록 시 예외. 변형 3개·단일 변수 규칙은 사내 설계값(제안) — 2026-08-23 theoptimizer 원문 재확인 결과 3개를 명시하지 않고 오히려 4~6개를 권장, 공식 근거 없음",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-8020-ratio-drift",
      "stage": "propose",
      "channel": "meta",
      "when": "주간 제안 묶음의 신규 각도(net-new) 비율이 10% 미만 또는 30% 초과",
      "metric": "net_new_ratio_weekly",
      "condition": "< 0.10 OR > 0.30",
      "action": "80/20 이탈 경고, 비율 조정 제안",
      "guardrail": "신규 계정(승자 소재 0개)은 규칙 면제. 80/20 기준선은 사내 설계값(제안) — 2026-08-23 scigrowth 원문에 해당 비율 없음, 원문은 월 신규 컨셉 수(8~15개+)만 제시",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-priority-not-reproducible",
      "stage": "propose",
      "channel": "meta",
      "when": "동일 입력으로 우선순위 재계산 시 상위 5개 순위가 달라지거나 산식에 미집행 소재 예측치가 포함됨",
      "metric": "top5_rank_match, formula_uses_predicted_metrics",
      "condition": "top5_rank_match = false OR formula_uses_predicted_metrics = true",
      "action": "우선순위 무효, 산식·모델 버전 기록 후 재실행",
      "guardrail": "산식 변경 시 과거 우선순위와 비교 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-volume-over-capacity",
      "stage": "propose",
      "channel": "meta",
      "when": "주간 제안 수가 예산 구간 권장 월 볼륨(5K당 4~5개, 100K당 40~50개)의 주 환산치 2배 초과",
      "metric": "weekly_proposal_count_ratio",
      "condition": "> 2.0",
      "action": "상위 우선순위만 전달, 나머지 백로그 이동",
      "guardrail": "백로그 제안은 2주 후 근거 데이터 재검증 없이는 재부상 금지. 예산 구간별 개수는 사내 설계값(제안) — 2026-08-23 Foxwell 원문에 해당 수치 없음(원문은 소재 집중도 70% 초과를 경고 신호로 다룸)",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-meta-evidence",
      "section": "verify",
      "id": "verify-propose-meta-human-gate-evidence",
      "stage": "propose",
      "channel": "meta",
      "when": "표본 부족·교란 변수·산식 불투명 플래그 중 1개 이상",
      "metric": "blocking_flags",
      "condition": ">= 1",
      "action": "자동 세팅 전달 차단, 승인 대기열 등록",
      "guardrail": "승인자 식별자·시각 기록 없이는 해제 불가",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-feed-title-spec",
      "stage": "propose",
      "channel": "google",
      "when": "피드 제목 제안이 150자 초과, 프로모션 문구·전체 대문자·느낌표/이모지 포함, 또는 랜딩 상품명의 브랜드·모델명과 불일치",
      "metric": "title_len, promo_phrase_hit, caps_ratio, landing_identifier_match",
      "condition": "title_len > 150 OR promo_phrase_hit >= 1 OR caps_ratio > 0.5 OR landing_identifier_match == false",
      "action": "제안 기각, Merchant Center title 규격 위반 사유 기록",
      "guardrail": "브랜드명 자체가 대문자 약어(예: LG)인 경우 caps 검사 예외",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-feed-title-no-search-evidence",
      "stage": "propose",
      "channel": "google",
      "when": "피드 제목 제안이 검색어 보고서 상위 전환 검색어를 하나도 포함하지 않거나 기존 제목과 유사도 0.9 이상",
      "metric": "converting_query_included, similarity_to_current_title",
      "condition": "converting_query_included == false OR similarity_to_current_title >= 0.9",
      "action": "'근거 없음/변경 효과 없음'으로 기각",
      "guardrail": "신상품(검색어 데이터 0)은 카테고리 평균 검색어로 대체 허용",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-feed-structured-title-mix",
      "stage": "propose",
      "channel": "google",
      "when": "같은 상품에 title 변경 제안과 structured_title 제안이 동시에 존재",
      "metric": "title_and_structured_title_both_proposed",
      "condition": "== true",
      "action": "혼용 차단, 하나만 선택하도록 요구",
      "guardrail": "없음",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-feed-policy-suspect",
      "stage": "propose",
      "channel": "google",
      "when": "제목 제안에 타 브랜드명·'정품 보장'·비교 표현·의약 효능 주장 탐지",
      "metric": "mc_policy_suspect_hits",
      "condition": ">= 1",
      "action": "비승인 후보 라벨, 사람 확인 큐로 이동",
      "guardrail": "자동화는 '의심'까지만 판정",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-video-evidence",
      "stage": "propose",
      "channel": "google",
      "when": "유튜브 영상 방향 제안의 근거 영상 30일 조회수가 임계 미만이거나 시청 완료율 구간 데이터가 첨부되지 않음",
      "metric": "video_views_30d, retention_breakdown_attached",
      "condition": "video_views_30d < 1000 OR retention_breakdown_attached == false",
      "action": "제안을 '가설 수준'으로 하향, 데이터 첨부 요구",
      "guardrail": "조회수 임계 1,000은 운영 경험치(출처 없음), 계정별 조정",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-video-format-limit",
      "stage": "propose",
      "channel": "google",
      "when": "제안 영상 길이·비율이 목표 포맷 한도(범퍼 6초 이하, 건너뛸 수 없는 인스트림 60초 이하, 세로형 9:16 10~60초 권장)와 불일치",
      "metric": "proposed_duration_sec, proposed_aspect_ratio, target_format",
      "condition": "NOT within_format_limit(target_format)",
      "action": "실행 불가 표시, 포맷 재지정 요구",
      "guardrail": "건너뛸 수 없는 인스트림 60초 이하는 support.google.com/google-ads/answer/2375464 재검증 완료(2026-08-23). 과거 기록된 15~30초는 오기이므로 폐기",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-test-plan-missing",
      "stage": "propose",
      "channel": "google",
      "when": "성과 근거 제안에 test_plan(실험 유형·트래픽 분할·최소 기간·1차 지표) 중 하나라도 누락, 또는 최소 기간이 4주 미만",
      "metric": "test_plan_fields_complete, test_plan_min_weeks",
      "condition": "test_plan_fields_complete == false OR test_plan_min_weeks < 4",
      "action": "제안 '고위험' 등급, 실험 설계 보완 전 실행 금지",
      "guardrail": "규격·정책 수정 제안은 test_plan 면제. 최소 4~6주는 support.google.com/google-ads/answer/10682377 기준(재검증 완료, 과거 2~4주는 오기)",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-full-replace-without-experiment",
      "stage": "propose",
      "channel": "google",
      "when": "기존 애셋·제목을 실험 없이 전면 교체(활성 애셋의 50% 초과 동시 교체) 제안",
      "metric": "replace_ratio, experiment_attached",
      "condition": "replace_ratio > 0.5 AND experiment_attached == false",
      "action": "단계적 교체 또는 광고 변형/맞춤 실험으로 전환 요구",
      "guardrail": "동시 다수 애셋 교체는 `google-rsa-asset-refresh-cadence`와 충돌하므로 차단",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-priority-formula",
      "stage": "propose",
      "channel": "google",
      "when": "우선순위 점수에 산식·가중치·입력값이 기록되지 않았거나 동일 입력 재계산 결과가 다름",
      "metric": "priority_formula_recorded, priority_recompute_match",
      "condition": "priority_formula_recorded == false OR priority_recompute_match == false",
      "action": "점수 무효, 산식 기록 후 재계산",
      "guardrail": "전환 데이터 없는 예상 영향은 영향 점수 50% 상한",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-brand-legal-gate",
      "stage": "propose",
      "channel": "google",
      "when": "제안 문구에 브랜드 금칙어, 근거 없는 최상급 표현(최고·1위·유일), 인증 필요 업종 키워드 탐지",
      "metric": "brand_banned_hits, superlative_without_evidence, restricted_vertical_hits",
      "condition": "brand_banned_hits >= 1 OR superlative_without_evidence >= 1 OR restricted_vertical_hits >= 1",
      "action": "우선순위와 무관하게 사람 승인 큐로 이동, 자동 실행 금지",
      "guardrail": "승인자 식별자·시각 기록 없이는 해제 불가",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-feed-video-testing",
      "section": "verify",
      "id": "verify-propose-google-final-gate",
      "stage": "propose",
      "channel": "google",
      "when": "규격·근거·테스트 설계·우선순위 산식·브랜드/법규 검사 중 1개 이상 실패",
      "metric": "failed_checks",
      "condition": ">= 1",
      "action": "제안 '보류' 상태, 세팅 단계 전달 차단",
      "guardrail": "보류 해제는 사람만 가능, 해제 사유 기록 필수",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-evidence-missing",
      "stage": "propose",
      "channel": "google",
      "when": "제안 객체에 교체 대상 애셋 ID·성과지표(노출·클릭·전환 또는 구버전 라벨), 조합 보고서 ID, 검색어 근거 중 하나도 없음",
      "metric": "evidence_fields_present",
      "condition": "== 0",
      "action": "제안을 unsupported로 분류, 자동 실행 금지, 사람 검토 큐로 이동",
      "guardrail": "규격·정책 수정 제안(오탈자·글자수 초과)은 근거 없이도 통과 허용",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-label-sample-insufficient",
      "stage": "propose",
      "channel": "google",
      "when": "'낮음' 라벨(또는 낮은 전환·클릭 지표)을 근거로 교체를 제안했으나 애셋 30일 노출이 설계 임계 미만이거나 광고 게재일이 14일 미만",
      "metric": "asset_impressions_30d, days_since_asset_added",
      "condition": "asset_impressions_30d < 5000 OR days_since_asset_added < 14",
      "action": "제안 보류, '표본 부족' 사유 기록",
      "guardrail": "구글은 애셋 성과 라벨 컬럼을 2025-06-05부로 폐기하고 전체 성과 지표로 대체했으며(support.google.com/google-ads/answer/9564897), 개별 애셋의 통계적 유의성 최소 표본 기준을 공식 문서로 제시하지 않는다(answer/16259414). 임계값 5,000은 재검증 결과 공식 근거를 찾지 못한 설계값(제안)이며 계정 규모별 상향 가능",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-learning-asset-replace",
      "stage": "propose",
      "channel": "google",
      "when": "구버전 화면 기준 라벨이 '학습 중' 또는 '—'(평가 없음)인 애셋을 교체 대상으로 지정, 또는 신규 화면 기준 30일 노출이 0인 애셋",
      "metric": "target_asset_label, asset_impressions_30d",
      "condition": "target_asset_label IN ['learning', 'none'] OR asset_impressions_30d == 0",
      "action": "교체 제안 기각(라벨 기준) 또는 '수 주 노출 0 지속 확인 후 재검토'로 보류(신규 지표 기준), 데이터 누적 대기 알림",
      "guardrail": "정책 위반·오탈자 애셋은 라벨/지표와 무관하게 교체 허용. 노출 0 지속 시 교체 검토는 구글 공식 안내(answer/9781208: \"If an asset receives zero impressions for several weeks, consider replacing the asset\")를 따름",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-top-combination-conflict",
      "stage": "propose",
      "channel": "google",
      "when": "교체 대상 애셋이 조합 보고서 상위 5개 조합 중 2개 이상에 포함됨",
      "metric": "target_asset_top_combination_count",
      "condition": ">= 2",
      "action": "모순 제안 플래그, 교체 대신 변형(variant) 추가 제안으로 전환 요구",
      "guardrail": "조합 보고서는 노출 기준이며 정적 광고 복제용이 아님을 제안문에 명시(answer/11894820)",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-ad-strength-objective",
      "stage": "propose",
      "channel": "google",
      "when": "제안 목적이 Ad Strength 등급 상승이거나 기대효과에 Ad Strength 수치를 성과로 인용",
      "metric": "objective, expected_effect_source",
      "condition": "objective == 'ad_strength_up' OR expected_effect_source == 'ad_strength'",
      "action": "'다양성 보강' 유형으로 재분류, 우선순위 점수의 성과 가중치 0 적용",
      "guardrail": "Ad Strength '미흡'만으로 기존 애셋 자동 기각 금지. '미흡→우수 개선 시 전환 X% 증가' 같은 수치는 공식 문서(answer/9142254)에서 확인되지 않으므로 기대효과로 인용 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-char-slot-limit",
      "stage": "propose",
      "channel": "google",
      "when": "제안 텍스트가 글자수 한도(RSA 30/90·한국어 15/45, PMax 헤드라인 30·긴 헤드라인 90·설명 90)를 넘거나 슬롯이 가득 찬 상태에서 replace_target 없이 '추가' 제안",
      "metric": "proposal_char_len, slot_free_count, replace_target",
      "condition": "proposal_char_len > limit OR (slot_free_count == 0 AND replace_target IS NULL)",
      "action": "실행 불가 표시, 글자수 축약 또는 교체 대상 지정 요구",
      "guardrail": "자동 축약본을 제안 원문 대신 제출 금지",
      "confidence": "high"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-pin-position-break",
      "stage": "propose",
      "channel": "google",
      "when": "핀이 걸린 위치의 유일한 애셋을 교체하면서 동일 위치 핀·동일 컴플라이언스 문구를 유지하지 않음",
      "metric": "pinned_position_coverage_after",
      "condition": "== 0",
      "action": "제안 차단, 핀 위치 커버리지 유지 조건 추가 요구",
      "guardrail": "법적 고지·브랜드명 핀은 자동 해제 금지",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-duplicate-asset",
      "stage": "propose",
      "channel": "google",
      "when": "제안 문구와 기존 애셋(활성+90일 내 일시정지)의 정규화 유사도가 임계 이상",
      "metric": "max_similarity_to_existing",
      "condition": ">= 0.85",
      "action": "중복 기각, 가장 유사한 기존 애셋 ID 첨부",
      "guardrail": "임계값은 운영 경험치(출처 없음), 변경 시 과거 판정과 비교 금지",
      "confidence": "low"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-repetition-dki",
      "stage": "propose",
      "channel": "google",
      "when": "제안 세트 내 동일 구문 3회 이상 반복 또는 DKI 사용 헤드라인 2개 초과, 또는 DKI 기본 텍스트가 글자수 초과",
      "metric": "repeated_phrase_count, dki_headline_count, dki_default_len",
      "condition": "repeated_phrase_count >= 3 OR dki_headline_count > 2 OR dki_default_len > limit",
      "action": "반복·DKI 경고, 중복 구문 제거 후 재제출 요구",
      "guardrail": "상표·정책 민감어가 삽입될 수 있는 DKI는 차단",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-pmax-video-gap",
      "stage": "propose",
      "channel": "google",
      "when": "영상 애셋 0개인 PMax 애셋그룹에 텍스트·이미지 제안만 있고 영상 방향 제안이 없음",
      "metric": "video_asset_count, has_video_direction_proposal",
      "condition": "video_asset_count == 0 AND has_video_direction_proposal == false",
      "action": "'자동 생성 영상 대체 위험' 미해소 경고, 영상 방향 제안 추가 요구",
      "guardrail": "영상 제작 자체는 범위 밖, 방향(길이·비율·메시지)만 제안",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-google-rsa-pmax-evidence",
      "section": "verify",
      "id": "verify-propose-google-min-conversion-gate",
      "stage": "propose",
      "channel": "google",
      "when": "성과 근거 제안의 대상 광고/애셋그룹 30일 전환이 임계 미만",
      "metric": "conversions_30d",
      "condition": "< 30 (검색 RSA) OR < 20 (PMax 애셋그룹)",
      "action": "제안 등급을 '가설 수준'으로 하향, 자동 실행 금지",
      "guardrail": "규격·정책 제안은 전환량과 무관하게 통과",
      "confidence": "medium"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-comparative-claim-evidence-required",
      "when": "제안 카피에 비교 어휘(~보다/1위/업계 최저·최고/타사 대비) 포함",
      "metric": "comparative_claim_evidence_link",
      "condition": "== null",
      "action": "제안 생성 차단, 근거자료 링크 첨부 요청 후 재제출",
      "guardrail": "근거자료는 법령상 시험·조사기관 또는 사업자와 독립적으로 경영되는 시험·조사기관의 객관적·타당한 방법에 의한 시험·조사 결과만 인정(비교표시·광고에 관한 심사지침 III.3), 단순 자사 주장·블로그 후기는 불인정, 법무 승인 우선순위 상향",
      "confidence": "high",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-endorsement-disclosure-required",
      "when": "제안 카피에 후기/체험단/인플루언서 협업 문구 포함",
      "metric": "economic_relationship_disclosure_field",
      "condition": "== empty",
      "action": "경제적 이해관계 표시 문구 필드 채우기 전까지 제안 차단",
      "guardrail": "추천·보증 등에 관한 표시·광고 심사지침 기준 적용 — 위치(제목/첫부분, 사진은 사진 내·첫번째 해시태그)·형태(본문과 구분되는 크기·색)·인정문구('#광고','#협찬','대가성 광고','금전적 지원' 등)·불인정문구('체험단','체험 후기',브랜드해시태그만,'AD'/'PR'/'Sponsor'/'Collab'/'Ambassador' 외국어단독)를 모두 검사, 댓글·'더보기' 뒤 삽입은 불인정",
      "confidence": "high",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-factual-claim-substantiation-required",
      "when": "제안 카피에 가격·할인율·효능·순위 등 사실 주장 포함",
      "metric": "substantiation_evidence_attached",
      "condition": "== false",
      "action": "제안 confidence 자동 하향, 법무 승인 큐 최우선 라우팅",
      "guardrail": "실증자료 없는 사실 주장은 사람 승인 없이 테스트 큐 진입 금지. 참고: 공정위가 사후 실증자료를 요청하면 사업자 제출기한은 원칙 15일(불가항력 시 최대 30일, 표시·광고 실증에 관한 운영)이므로 사전 확보가 안전",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-repeat-violation-flag",
      "when": "동일 계정에서 유사 표현이 과거 반려/경고 이력 존재",
      "metric": "similar_expression_past_rejection_count",
      "condition": "> 0",
      "action": "법무 최우선 검토 대상으로 표시, 사유 미해소 시 자동 반려",
      "guardrail": "반복 위반 패턴은 임시중지명령 리스크 신호로 별도 로그에 기록",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-two-stage-approval-order",
      "when": "제안이 테스트 큐 진입을 시도",
      "metric": "approval_sequence",
      "condition": "!= [legal_approved, marketing_approved]",
      "action": "순서 미충족 시 테스트 큐 진입 차단, 법무 승인부터 진행하도록 반려",
      "guardrail": "동시승인·순서 역전으로 우회 금지, 승인 이벤트는 감사 로그에 순서대로 기록",
      "confidence": "high",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-approval-sla-escalation",
      "when": "법무 승인 대기 상태 지속 시간(영업일)",
      "metric": "legal_review_pending_business_days",
      "condition": "> 3 (설계값)",
      "action": "담당자·상위 관리자에게 에스컬레이션 알림, 자동 승인 처리는 하지 않음",
      "guardrail": "SLA 초과가 자동 승인 사유가 되지 않도록 승인 로직과 알림 로직을 분리",
      "confidence": "low",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-rejected-duplicate-block",
      "when": "신규 제안과 과거 반려된 제안 간 카피 유사도",
      "metric": "copy_similarity_to_rejected",
      "condition": "> similarity_threshold(설계값) AND resolution_evidence == null",
      "action": "재제출 자동 차단, 반려 사유 해소 근거 첨부 시에만 사람 재검토 허용",
      "guardrail": "유사도 임계값은 설계값(제안), 채널별 정책 문서 값이 있으면 그 값 우선",
      "confidence": "low",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-compliance-approval",
      "section": "verify",
      "id": "verify-propose-common-channel-prefilter-pending-flag",
      "when": "제안이 이후 setup 단계로 넘어갈 채널의 채널별 propose 정책 사전필터를 아직 통과하지 않음",
      "metric": "channel_policy_prefilter_status",
      "condition": "!= passed",
      "action": "제안 객체에 '채널 정책 검토 대기' 플래그 유지, setup 단계 전달 차단",
      "guardrail": "이 문서(공통)의 승인만으로 채널별 심사(예: Meta/Google propose 문서)를 대체하지 않음",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-raw-metric-source-required",
      "when": "제안 근거 지표의 출처가 채널 원시 리포트가 아니라 추정/모델링 지표",
      "metric": "metric_source_type",
      "condition": "!= raw_platform_report",
      "action": "제안 생성 차단, 원시 리포트 지표로 재계산 요청",
      "guardrail": "iOS 14.5+ 모델링 전환 등 추정치는 단독 근거로 사용 금지, 보조 지표로만 표기",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-min-sample-gate",
      "when": "대조군/실험군 전환수가 표본크기 공식(NIST N=(z_1-a/2+z_1-b)^2*(sigma/delta)^2) 기반 최소 N 미만",
      "metric": "cell_conversion_count",
      "condition": "< required_min_n(alpha, power, effect_size)",
      "action": "제안을 '표본 부족' 상태로 보류, 표본 충족 시점까지 관측 연장",
      "guardrail": "effect_size(delta)·alpha·power 값은 채널별 propose 문서 우선 적용, 없으면 설계값 사용(alpha=0.05는 NIST worked example과 일치, power=0.8은 저장소 자체 설계값). N이 작아 정규근사가 부적절하면 NIST 권고에 따라 Fisher's Exact Test로 대체",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-significance-required",
      "when": "두 비율(CTR/CVR 등) 차이 z검정 결과",
      "metric": "abs_z_stat",
      "condition": "<= z_critical(alpha=0.05)=1.96",
      "action": "유의하지 않음으로 판정, 승자/패자 라벨 부여 금지(추가 관측 또는 반려)",
      "guardrail": "alpha=0.05는 NIST 표본크기 핸드북(prc222) worked example과 일치하는 관례값, 채널별 기준이 있으면 그 값을 우선 사용",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-single-variable-diff",
      "when": "제안 객체와 baseline 간 변경 필드 수 계산",
      "metric": "diff_field_count",
      "condition": "!= 1",
      "action": "0이면 '변경 없음'으로 반려, 2 이상이면 원인 귀속 불가로 반려하고 단일 변수로 재구성 요청",
      "guardrail": "카피 내 복수 문구를 한 필드로 묶어 diff 1개로 위장하는 것 금지(하위 필드 단위로 diff 계산)",
      "confidence": "high",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-min-observation-window",
      "when": "제안 근거 관측 기간(일수) 산정",
      "metric": "observation_days",
      "condition": "< 7 (설계값)",
      "action": "요일 주기성 미확보로 제안 보류, 최소 기간 충족까지 대기",
      "guardrail": "채널별 propose 문서에 더 긴 최소 기간이 명시된 경우 그 값 우선. 구글애즈 공식 A/B 테스트(Experiments) 가이드는 결과 불명확 시 최소 2~3주, 일반적으로 최소 4~6주를 권장하므로[Google-실험모니터링, Google-실험페이지] 7일은 그보다 짧은 저장소 설계값 — 통계적 승자 확정에는 더 긴 기간을 권장. 메타 학습단계 문서의 '1주' 기준은 광고 전달 안정화 개념으로 통계적 유의성과는 다른 맥락[Meta-학습단계]",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-stale-data-window",
      "when": "제안 근거 데이터의 최신 시점과 제안 생성 시점 차이",
      "metric": "data_age_days",
      "condition": "> 30 (설계값)",
      "action": "오래된 데이터 기반 제안으로 표시, 최신 데이터로 재계산 후에만 제안 확정",
      "guardrail": "재계산 없이 오래된 결론을 그대로 재제출 금지",
      "confidence": "low",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-reproducibility-check",
      "when": "동일 metric 정의·동일 lookback window로 제안 근거를 재계산",
      "metric": "recompute_conclusion_match",
      "condition": "== false",
      "action": "제안 확정 보류, 원인(데이터 갱신·집계 로직 변경 등) 조사 후 재계산",
      "guardrail": "재현 실패 이력이 반복되는 지표 파이프라인은 별도 데이터 유효성 검증(analyze 문서)으로 에스컬레이션",
      "confidence": "medium",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-low-confidence-downgrade",
      "when": "표본 미달·기간 미달·다변수 diff·재현 실패 게이트 중 하나 이상 위반",
      "metric": "gate_violation_count",
      "condition": "> 0",
      "action": "제안 confidence를 한 단계 하향(high→medium→low), 사람 승인 큐 우선순위 하향",
      "guardrail": "confidence 하향 없이 위반 상태로 승인 큐에 표시 금지",
      "confidence": "high",
      "stage": "propose",
      "channel": "common"
    },
    {
      "docId": "verify-propose-common-evidence-test-design",
      "section": "verify",
      "id": "verify-propose-common-duplicate-hypothesis-cooldown",
      "when": "동일 가설(변경 필드+변경 방향)이 최근 쿨다운 기간 내 반려된 이력 존재",
      "metric": "same_hypothesis_recent_rejection",
      "condition": "== true AND days_since_rejection < cooldown_days(설계값)",
      "action": "재제안 자동 차단, 반려 사유 해소 근거를 첨부한 경우에만 사람 검토로 예외 허용",
      "guardrail": "쿨다운 기간·유사도 임계값은 설계값(제안), 공식 기준 없음",
      "confidence": "low",
      "stage": "propose",
      "channel": "common"
    }
  ]
}