넛지 스팸 대응 · 발신 도메인 전환

bridge.rinda.ai 마케팅 primary 전환 — 오늘 조치 & 목요일 beta sync 체크리스트

라운드로빈→고정 primary는 이미 alpha 머지(#9864/#9877). 오늘은 발신 도메인을 청정 워밍 도메인 bridge.rinda.ai로 확정하고 alpha primary로 등록했습니다. 목요일 beta sync에서 놓치면 안 되는 항목을 정리합니다.
이철희 · 2026-07-13 · 발송 primary = bridge.rinda.ai (alpha)

1오늘 조치사항 완료

  1. 근본원인 확정 — 넛지 스팸 최대원인 = SES governor 마케팅 도메인 라운드로빈. 단 고정 primary 전환은 이미 alpha 머지됨(#9864 고정 primary+캡 스필오버, #9877 발신 정체성). 로컬 체크아웃이 2커밋 stale이라 "미반영"으로 착시했던 것.
  2. notify.rinda.ai 셋업 → 전량 롤백 — 김규동님 Slack 지시대로 SES identity+DNS 6레코드 생성했으나, 팀 실제 결정(#9877)은 notify.grinda.ai였고 최종적으로 bridge.rinda.ai로 확정 → notify.rinda.ai SES identity·DNS 6레코드 완전 삭제.
  3. bridge.rinda.ai를 alpha 마케팅 primary로 등록 — 청정 워밍 도메인 분석(126개 중) → bridge 선정. alpha DB:
    -- rinda_managed_sending_domains (bridge 행 UPDATE)
    send_role   = 'system_marketing'
    daily_cap   = 50          -- 실수신자 평판 0 → 안전 램프
    display_order = 105        -- entry(110)보다 낮음 → pool[0]=고정 primary
  4. 검증 완료 — bridge SES(검증·DKIM·MAILFROM·config set=rinda-marketing) ✅ / DNS(DKIM3+MAILFROM+DMARC+SPF) ✅ / 워밍(day38·scale·enabled, rinda@bridge.rinda.ai) ✅ / 실발송 0·고객계정 0 ✅ / Reply-To=admin@grinda.ai 배선 ✅.
현재 상태: governor가 pool[0]=bridge.rinda.ai를 고정 primary로 발송. 캡 50이라 하루 첫 50통만 bridge, 초과분은 entry(110·cap 300)로 스필오버 — 캡 램프업 전까진 bridge가 소수 발송.

2보류·진행중 목요일 전 alpha 완료 권장

  • From 로컬파트 inforinda — 발신을 rinda@bridge.rinda.ai로. 워밍 persona(rinda@bridge.rinda.ai)와 동일 주소 = 평판 연속성. (#9877info@ 브랜드 결정을 rinda로 되돌림. governor MARKETING_LOCAL_PART 상수 1곳.) 풀 전체가 rinda@{도메인}로 통일됨.
  • 헥사고날 리팩터 + 제1원리 코드 정리 — 발송 코드 정리(분석 진행중). 단 프로젝트 원칙(단일 사용처 추상화 금지·김치볶음밥)에 비춰 과잉 추상화 여부를 정직히 판정 후 스코프 확정.
  • notify.grinda.ai 정리 — env를 bridge로 이전한 뒤 SES/DNS 삭제 가능(지금 지우면 env fallback 깨짐).

※ 위 코드 변경은 alpha에 먼저 머지돼야 목요일 sync로 beta에 함께 넘어갑니다.

3발견된 drift / gap

항목상태비고
마이그 012 notify.grinda.ai 풀등록(105/cap50)alpha 미반영012 중 channel 승격만 적용, notify 풀 insert는 안 들어감 (bridge로 대체됐으므로 moot)
마이그 012 channel→system_nudge_transactionalbeta 미반영alpha만 적용. beta channel은 아직 system_marketing (10개). 코드가 이 role을 안 읽어 저영향
env AWS_SES_SENDER_EMAIL_MARKETING= info@notify.grinda.aialpha·beta 둘 다. bridge와 불일치(단 governor ON이라 fallback로만 쓰임)
notify.grinda.ai SES default config setrinda-transactional마케팅인데 트랜잭셔널 default — mismatch. 코드가 config set 명시전달이라 저영향

4목요일 alpha→beta sync 추가 조치 체크리스트

핵심 함정: bridge 등록은 마이그레이션이 아니라 직접 SQL이라 코드 sync로 beta에 자동 반영되지 않습니다. 코드만 넘어가고 DB row가 없으면 beta governor는 bridge를 못 뽑습니다 → beta DB에 수동 적용 필수.
  • [사전] alpha에 pending 코드 머지rinda@ 변경·(정리한다면) 리팩터를 목요일 전에 alpha 머지. 안 되면 이번 sync에선 info@로 나감.
  • 코드 syncalpha-beta-sync 스킬로 #9864/#9877(+신규) → beta 배포. 고정 primary+캡 스필오버 코드가 beta에 올라감.
  • [코드 배포 후] beta DB에 bridge 수동 등록 — 순서 중요(구코드에 먼저 넣으면 오작동, #9877 지침):
    -- beta rinda_managed_sending_domains (bridge 행)
    -- ⚠ beta는 마이그 012 미반영 → system_marketing 10개(channel 포함).
    -- 먼저 beta의 system_marketing 최저 display_order 확인 후 그보다 낮게.
    UPDATE rinda_managed_sending_domains
       SET send_role='system_marketing', daily_cap=50, display_order=<beta최저-5>
     WHERE domain='bridge.rinda.ai';
  • beta bridge 행 존재 확인 — beta rinda_managed_sending_domains에 bridge.rinda.ai 행이 있는지 먼저 확인(없으면 INSERT). SES/DNS는 도메인 단위라 alpha/beta 공유(추가 작업 없음).
  • env 정렬(선택)AWS_SES_SENDER_EMAIL_MARKETING을 bridge로 맞출지 결정(governor ON이면 fallback만 영향).
  • (선택) 마이그 012 beta 적용 — channel 승격을 beta에도 반영할지. #9877 지침 = 목요일 배포 적용.
  • 검증 — beta governor가 pool[0]=bridgerinda@bridge.rinda.ai 발송하는지 + Reply-To=admin@grinda.ai 확인.
참고 — 왜 beta에서도 bridge가 즉시 "워밍됨"인가: SES identity·도메인 평판은 계정·도메인 단위(환경 무관). bridge는 alpha 워밍 트래픽으로 이미 SES 도메인 평판이 형성 중이라, beta 발송도 같은 도메인 평판을 그대로 씁니다. (warmup_account 엔진은 alpha 전용이지만 발송 도메인은 공유)

5bridge.rinda.ai 발송 범위 (참고)

bridge로 나감 (marketing)bridge로 안 나감
자동 넛지 · 릴리즈노트/업데이트노트 · 관리자 넛지 · 뉴스레터 · 리소스/무료툴 넛지 · 넛지 테스트 OTP·인증·환영 → OTP풀(fetch/herald/second) · 답장알림/reply넛지 → channel.rinda.ai · 고객 시퀀스 → 고객 도메인풀

From rinda@bridge.rinda.ai(변경 후) · Reply-To admin@grinda.ai · 트랜잭셔널/고객발송과 평판 분리 유지.