0x00

리서치 / 일일 리포트

  • 읽은 자료 1건
  • 정본 반영 1개 파일
  • 레이더 1건
한 줄 요약X가 NSFW 미디어에 나이 게이팅을 강제하는 16개국 목록을 처음 코드에 명시했다. 한국도 이 목록에 들어 있다.

오늘 함께 본 다른 변화는 다음과 같다.

  • 같은 커밋은 Rust와 Scala 두 판정 스택의 국가 목록이 어긋나는지 30초마다 확인하는 장치도 붙였다.
  • 같은 커밋은 motion-reveal 프레임 검출을 진입 조건으로 쓰는 고인기 영상 전용 안전 파이프라인을 새로 만들었다.
  • arXiv cs.IR 신규 30건 가운데 Snap의 광고 retrieval 논문 CAMIE 한 편만 정독 기준을 통과했다.

1NSFW 나이 게이팅을 강제하는 16개국이 처음 코드에 명시됐다 — X

자료 X commit 6384ca7 "Open-source X Recommendation Algorithm" — xai-org/x-algorithm 저장소, 2026-09-01 00:11 UTC, 코드 공개(70 파일, +2,247/−735). 이 노트들은 4세대 공개 뒤의 X 커밋에 차례로 번호를 붙여 부르며, 이 커밋은 4세대+12다.

배경 visibility-filtering(VF)은 포스트마다 이 뷰어에게 보여도 되는지를 판정하는 서비스다. X는 2026-08-13에 4세대를 공개하면서 Rust로 다시 쓴 visibility-filtering/ 스택 전체를 공개했고, 그 뒤 후속 커밋들이 이 스택을 매일 조금씩 다듬어 왔다. 지금까지 밝혀진 내용은 네 가지다.

  • labeling path는 Content Understanding → Labeling Rules → Storage → Visibility Filtering의 4단계다.
  • 규칙은 세 SafetyLevel(지면별 정책 묶음)로 나뉜다. 추천 포스트용 TimelineHomeRecommendations에 54개(팔로잉용 TimelineHome의 28개 포함), FilterAll에 1개가 걸려 있다 확인 — visibility-filtering/rules/registry.rs의 wired_rule_order_matches_pre_migration_sequence 테스트.
  • VF는 fail-closed로 동작한다. 판정 없이 리턴되는 경로는 모두 drop으로 처리한다.
  • dark_traffic 미러링, reference_compare 하니스, 90건 golden corpus로 재작성 결과의 회귀를 자동으로 막는다.

이번 커밋은 이 스택에 두 가지를 더한다.

  • 첫째, 어느 나라에서 age-gating을 강제하는지를 처음 코드에 명시한다. 종전에는 나이를 밝히지 않은 뷰어를 거르는 규칙이 "no_stated_age + gated country"로 판정한다는 것만 밝혀졌고, 그 "gated country" 목록은 공개되지 않았다.
  • 둘째, motion-reveal이라는 영상 회피 대응 기법을 처음 밝힌다(아래 C에서 설명한다). Grok LLM이 이 기법으로 처리된 프레임을 받아 판정에 참고하도록 프롬프트가 구조화됐다.

새로 알게 된 것

A. NSFW 게이팅 대상 16개국이 코드에 명시됐고, Scala 쪽 목록과 어긋나면 드러난다

이번 커밋은 나이 게이팅 국가 목록을 코드에 담았고, 이 목록을 런타임에 바꾸고 감시하는 장치도 함께 넣었다 확인.

  • NSFW 게이팅 대상 16개국이 새 파일에 기본값으로 들어갔다 확인 — visibility-filtering/params.rs.
    • 새 파일은 visibility-filtering/params.rs(216줄)이다. 새 struct NsfwGatingCountries가 다음 16개 국가 코드를 default로 담는다.

      pub fn default_nsfw_gating_countries() -> Vec<String> {
          [
              "ar", "au", "br", "ca", "de", "es", "fr", "gb", "id", "it", "kr", "mx", "nl", "ph", "pt",
              "th",
          ]
          .map(str::to_string)
          .to_vec()
      }
      
    • 풀어 쓰면 아르헨티나·호주·브라질·캐나다·독일·스페인·프랑스·영국·인도네시아·이탈리아·한국·멕시코·네덜란드·필리핀·포르투갈·태국이다.

  • 이 목록은 feature switch로 런타임에 덮어쓸 수 있고, 30초마다 다시 읽는다 확인 — visibility-filtering/params.rs의 spawn_refresh 함수.
    • feature switch 이름은 rust_vf_nsfw_gating_countries이고, 목록은 ArcSwap으로 감싸 둔다.
  • Rust VF와 Scala VF 두 스택이 병렬로 도는 상태에서, 두 스택이 참조하는 국가 목록이 어긋나면 관측할 수 있게 만들었다 확인 — 같은 파일의 check_drift 함수.
    • 같은 파일의 refresh_and_check_drift 함수가 refresh마다 sibling YAML 파일 country_specific_nsfw_content_gating.yml을 함께 읽어, Rust 쪽 결과가 Scala 목록과 일치하는지 확인한다.
    • 이 YAML 파일은 Scala VF 스택이 참조한다.
    • 두 목록이 다르면 tracing::warn!을 남기고, xai_stats_receiver의 nsfw_gating_countries_drift 카운터를 올린다.
  • 배열 값에 잘못된 원소가 섞이면 일부만 쓰지 않고 기본 목록 전체로 돌아간다 확인 — 같은 파일의 테스트 절.
    • 회귀 테스트 malformed_value_falls_back_whole_not_partial이 이 계약을 고정한다. 배열 값 안에 문자열이 아닌 원소(예: 숫자 7)가 섞이면 부분 리스트가 아니라 전체 fallback을 쓴다.
    • 예를 들어 feature switch가 ["xx", 7]로 잘못 설정되면 "xx만 게이팅" 같은 어정쩡한 상태가 되지 않는다. 전부 default 16개국으로 돌아간다.
    • 부분 로드가 정책 이해에 혼선을 만드는 시나리오를 원천 차단한다.
  • NSFW 나이 게이팅 규칙 세 개 가운데 나이 미확인 뷰어 규칙 하나에만 국가 목록이 주입됐다 확인 — visibility-filtering/rules/nsfw_age_gating.rs:68-88.
    • NSFW/GORE 라벨이 붙은 미디어 후보에 대해 세 규칙이 병렬로 작동한다.
    • 로그아웃 뷰어면 국가와 상관없이 무조건 드롭한다(SensitiveViewerLoggedOutDropRule).
    • 뷰어가 18세 미만으로 확인되면 국가와 상관없이 드롭한다(SensitiveViewerUnderageDropRule).
    • 뷰어가 나이를 밝히지 않았고 위 16개국 리스트에 속하면 드롭한다(SensitiveViewerNoStatedAgeDropRule).
  • 세 번째 규칙이 이 국가 목록을 참조한다. 즉 나이 미확인 뷰어에게는 16개국에서만 age-gating이 강제된다.
    • 다른 나라(예: 미국·일본·러시아 등)에서는 나이 미확인 상태여도 이 규칙이 걸리지 않는다.

"base: !context.viewer().is_author() && tweet.has_media() && (tweet.has_safety_label(SafetyLabelType::NSFW_HIGH_PRECISION) || tweet.has_safety_label(SafetyLabelType::NSFW_HIGH_RECALL) || (tweet.is_nsfw_flagged() && !tweet.is_retweet())) ... if context.viewer().has_no_stated_age() && context.viewer().country().is_some_and(|c| self.gating_countries.contains(c)) && sensitive_base_condition(context) → Drop(FilteredReason::ContainNsfwMedia)" — visibility-filtering/rules/nsfw_age_gating.rs

B. 고인기 영상만 따로 검사하는 안전 파이프라인이 새로 생겼다

이번에 생긴 특수 영상 파이프라인은 grox(Grok 기반 nearline 분류기 서브레포)의 안전 판정 파이프라인 가운데 가장 비싼 층이다. grox는 Content-understanding 단계에서 이미 여러 안전 판정 파이프라인을 돌리고 있었다. 새 파이프라인은 고팬(deluxe tier, 즉 favorite 카운트가 임계 이상인 영상)에만 진입하고, 다단 태스크 DAG를 거친 뒤 Grok 4.5 심판까지 호출한다. 이런 구성이 코드로 처음 공개됐다는 것이 이번 커밋의 핵심이다.

  • 새 파일이 태스크 9개가 한 줄로 이어지는 9단 DAG를 정의한다 확인 — grox/flows/ptos/plan_safety_ptos_special_video.py.

    • 새 파일은 grox/flows/ptos/plan_safety_ptos_special_video.py(55줄)이고, 파이프라인 이름은 PlanSafetyPtosSpecialVideo다.

    • 의존 그래프는 다음과 같다.

      special_video_filter
          → annotation_rate_limit
              → media_hydration
                  → special_video_screen
                      → category_detection
                          → policy_detection
                              → safemodel_sex_nudity
                                  → adult_content_cross_validation (policy·safemodel 두 결과에 의존)
                                      → result_sink
      
  • 첫 태스크 special_video_filter는 세 조건을 모두 만족하는 포스트만 들여보낸다 확인 — grox/flows/ptos/task_safety_ptos_special_video_filter.py.

    1. 포스트에 유저 정보가 있어야 한다(no_user가 아니어야 한다).
    2. media에 Video가 하나라도 있어야 한다. quoted post의 media도 합산한다.
    3. fav count가 grox_config.media_hydration.deluxe_fav_count_threshold 이상이어야 한다.
  • 즉 이 파이프라인은 바이럴이 확정된 고팬 영상에만 진입한다.

    • 값은 정확히 공개되지 않았지만, 이름이 deluxe_fav_count_threshold이라 임계가 상당히 높을 것으로 추정된다 추정.
    • 이 게이팅 자체가 비용 관리다. 스크리닝과 판정, LLM cross-validation 전 과정이 후보당 훨씬 비싸기 때문에 저팬 영상까지 확장하지 않는다.
  • 새 파이프라인의 핵심은 special_video_screen 태스크다. 영상에 motion-reveal 프레임이 있으면 그 영상을 특수 스크리닝 대상으로 넘긴다 확인 — grox/flows/ptos/task_special_video_screen.py.

    • 미디어 하이드레이션 뒤 각 영상의 motion_reveal_frames 필드를 검사하고, 이 필드가 비어 있지 않으면 특수 스크리닝 대상으로 진입시킨다.

      @classmethod
      def _technique_signals(cls, convo_video: ConvoVideo) -> dict[str, bool]:
          return {
              "motion_reveal": bool(convo_video.motion_reveal_frames),
          }
      
    • _eligible_with_post가 반환한 값이 다음 태스크로 넘어가는 게이트다. 스크리닝에 걸린 영상만 True가 된다.

    • 현재 검출 대상 기법은 motion_reveal 한 종류지만 dict 형태로 열려 있다. 향후 다른 회피 기법이 추가되면 이 dict가 확장된다.

C. motion-reveal은 정적 층을 빼고 움직임 층을 키워 오버레이 아래를 드러낸다

motion-reveal 프레임은 원본 영상에서 정적 층을 빼고 미약한 움직임 층을 증폭한 프레임이다. 이 처리를 하면 영상 위의 정적 오버레이(예: 캡션 이미지·투명 마스크·워터마크 등)에 가려 있던 실제 콘텐츠가 드러난다. 성인 콘텐츠 회피 기법 중 하나는 정적 이미지 오버레이로 성인 영상을 가리는 것이고, motion-reveal은 그 오버레이를 계산으로 제거한다.

  • grox/core/lm/convo.py가 정의하는 상수가 이 기법의 의도를 밝힌다 확인 — grox/core/lm/convo.py.

"Motion-reveal stills for this video follow (static layer subtracted, faint moving layers amplified); they distort colors and motion, and can make opaque clothing look like bare skin. People or acts absent from the frames above but visible here are the video's actual overlay-hidden content; judge anyone already visible above solely from the original frames." — grox/core/lm/convo.py MOTION_REVEAL_DESCRIPTION

상수 문구는 중요한 점 두 가지를 분명히 적는다.

  • 첫째, motion-reveal 프레임은 색과 움직임을 왜곡할 수 있다. 프롬프트 자체에, motion-reveal 후처리가 아티팩트를 만들어 "불투명 옷이 맨살처럼 보이게" 할 수 있다는 경고가 들어 있다.
    • 즉 이 신호는 재현율이 높은 대신 정확률이 낮을 수 있다. 그래서 무조건 hard 판정에 쓰지 않고, downstream 카테고리 판정과 cross-validation을 거치는 파이프라인의 진입 신호로만 쓴다.
  • 둘째, 판정에서 원본 프레임과 motion-reveal 프레임을 따로 다룬다. 프롬프트에는 "원본 프레임에도 이미 보이는 사람은 원본만 근거로 판정하라, motion-reveal 프레임에만 새로 보이는 것이 있으면 그것이 진짜 숨겨진 콘텐츠다"라는 판정 rubric이 적혀 있다.
    • 즉 motion-reveal이 만드는 잘못된 인상(원본에서도 이미 있는 사람의 옷이 벗겨 보이는 경우)을 원본 대조로 상쇄한다.

motion-reveal 프레임을 만드는 이미지 처리 함수들도 들어갔다 확인 — grox/libs/video_tools/image.py. 파일은 grox/libs/video_tools/image.py(+125)이고, 함수는 CLAHE·adaptive brightness·saturation boost·sharpen 등이다. 즉 X 안전 파이프라인이 영상 프레임을 능동적으로 변형해서 회피된 콘텐츠를 드러내는 전처리를 프로덕션 안으로 넣었다는 뜻이다.

D. 스크리닝을 통과한 영상은 기존 판정 단계를 지나 Grok 4.5 심판까지 간다

motion-reveal 스크리닝 뒤로는 기존 파이프라인이 그대로 이어진다.

  • 스크리닝 뒤에는 카테고리 판정과 정책 판정을 거친 다음, safemodel 판정 뒤에 cross-validation이 돈다 확인 — plan_safety_ptos_special_video.py의 TASK_DEPENDENCIES.
    • 카테고리 판정은 TaskSafetyPtosCategoryDetection, 정책 판정은 TaskSafetyPtosPolicyDetection이다.
    • 차례로 도는 두 태스크는 TaskSafetyPtosSafemodelSexNudity와 TaskSafetyPtosAdultContentCrossValidation이다. 뒤쪽은 정책 판정과 safemodel 판정 결과에 모두 의존한다.
    • 그 뒤 TaskWriteSafetyPostAnnotationsResultSink가 결과를 기록한다.
  • 마지막 두 태스크는 2026-08-17 커밋(4세대+2)에서 처음 공개됐다. safemodel은 자체 비전 모델이고, PtOS는 정책 태그다. 두 판정이 다르면 Grok 4.5가 심판으로 다시 판단한다.
    • 심판은 정확히는 EAPI_GROK_4_5_X_ALGO 엔드포인트다.
    • Grok 심판은 "hard adult content이면 원래 판정 유지, soft면 강등"으로 강등 방향으로만 작동한다. 이 내용은 기존 정본에 이미 반영돼 있다.
  • 이번 파이프라인이 새로 하는 일은 여기까지 오는 후보를 motion-reveal 스크리닝으로 좁히는 것이다. 즉 특정 회피 기법에 걸린 후보만 뽑아서 이 비싼 판정 스택에 태운다.
    • 비용 관리와 recall 향상을 동시에 달성하려는 구성이다 추정.
  • 특수 영상 경로에서 Grok 4.5 심판 호출이 실패하면 Soft로 강등한다 확인 — grox/flows/ptos/task_safety_ptos_adult_content_cross_validation.py 102–117줄.
    • 확인한 곳은 이 태스크의 _cross_validate 흐름이다.
    • Grok 심판 호출이 예외로 실패하면, task_type == SAFETY_PTOS_SPECIAL_VIDEO인 특수 영상 경로에서는 원 판정을 유지하지 않고 Soft로 강제 강등한다("Grok 4.5 Cross Validation failed").
    • 다른 경로에서는 원 판정 유지가 default였고, 특수 영상 경로만 fail-close 정책이 다르다.
    • 즉 X는 이 파이프라인의 출력을 더 조심스러운 방향으로 조정했다. 심판이 죽으면 무해 판정보다 안전 판정을 우선한다.

정본 반영 services/x.md의 다음 부분을 고쳤다.

  • 안전성 / visibility-filtering / labeling 파이프라인 절에 4세대+12(2026-09-01, 6384ca7) 하위 절을 새로 만들었다. NSFW 국가 게이팅 목록 16개, Rust와 Scala 사이의 drift 감시, PlanSafetyPtosSpecialVideo DAG, motion-reveal 회피 대응을 담았다.
  • 공개 소스 4세대 테이블에 4세대+12 행을 추가했다.
  • 한 줄 요약에 이번 커밋을 요약한 문장을 추가했다.
  • 최종 갱신을 2026-09-02로 바꿨다.

의미 이번 커밋으로 X는 나이 게이팅을 강제하는 국가를 코드에 처음 명시했고, 안전 스택은 회피 기법에 능동적으로 대응하는 층을 갖게 됐다. 이 층은 고팬 영상에만 걸리고, 다른 회피 기법을 더할 여지가 열려 있다.

  • 첫째, X가 어느 나라에서 age-gating을 강제하는지 코드에 처음 명시했다.
    • 이 목록은 원래 Scala VF(country_specific_nsfw_content_gating.yml)에도 있었다. Rust VF에도 default로 들어오고 두 목록이 어긋나면 metric으로 관측할 수 있게 되면서, X가 Rust로의 이관을 안전하게 완료하려는 흐름이 보인다.
    • 16개국의 선택 기준은 명시되지 않았다. 목록에는 EU 회원국 6개(독일·스페인·프랑스·이탈리아·네덜란드·포르투갈), 영국·캐나다·호주 같은 앵글로 국가, 브라질·아르헨티나·멕시코의 라틴아메리카, 한국·인도네시아·태국·필리핀의 아시아 국가가 들어 있다.
    • 미국은 목록에 없다. 미국 안에서는 나이 미확인 뷰어에게도 이 규칙이 걸리지 않는다.
    • 로그아웃 뷰어와 미성년으로 확인된 뷰어는 국가와 상관없이 드롭하는 별도 규칙(위 A절)이 맡는다.
  • 둘째, 안전 스택이 능동적 회피 대응 층을 갖게 됐다.
    • 종전까지 X 안전 파이프라인은 "모델이 라벨을 붙이면 → 규칙이 판정한다"는 수동 스택이었다.
    • 이제 그 앞에 "회피 기법을 검출하고 → 능동적으로 회피를 제거한 프레임을 만들어서 → 그 프레임으로 다시 판정한다"는 층이 추가됐다.
    • Grok LLM에게는 원본과 motion-reveal 두 프레임 셋을 함께 주면서, "motion-reveal은 왜곡을 만든다"는 caveat까지 프롬프트에 넣는다. 즉 LLM 판정을 회피 대응 도구로 쓰면서 그 도구의 한계도 프롬프트로 관리한다.
  • 셋째, 회피 대응은 고팬 영상에 국한된다.
    • fav 수가 deluxe_fav_count_threshold 이상인 영상만 이 파이프라인에 진입하고, 그 미만은 기본 파이프라인(safemodel과 PtOS까지)만 돈다.
    • X는 이중 논리로 이 구성을 만들었다. 확산이 확정된 콘텐츠에만 비싼 회피 대응을 걸어 비용을 관리하되, 그 콘텐츠는 확산 규모 때문에 회피의 인센티브도 크므로 회피 검출을 강화한다.
    • 새 영상이 아직 저팬일 때 회피 검출을 못 한다는 것이 이 아키텍처의 열린 약점이다. 이 약점은 확산이 시작된 뒤 판정을 다시 걸어 소급 처리하는 것으로 보완되어야 한다. 다만 소급 처리 경로가 공개되어 있는지는 확인되지 않았다.
  • 넷째, 다른 회피 기법을 새로 넣을 여지가 열려 있다.
    • _technique_signals dict의 구조가 새 기법 추가를 예상한 형태다. motion-reveal 다음으로 어떤 회피 기법이 추가될지가 관전 포인트다.
    • 후보로는 캡션 오버레이로 hate speech를 가리는 텍스트 회피, splash frame으로 첫 프레임만 무해하게 두는 시간 회피, chroma key 삽입 회피 등이 있다 추정.
  • 정본의 Meta·Netflix와 비교하면, 이번 X의 구성은 대형 오픈 플랫폼이 능동적 회피 대응 층을 코드로 공개한 첫 사례로 기록된다.
    • Meta는 브랜드 안전 스택을 광고 도메인에 한해 공개했고, 유기 피드의 회피 대응은 공개하지 않았다.
    • Netflix는 카탈로그가 큐레이션이므로 UGC 회피 대응이라는 카테고리 자체가 없다.

2cs.IR 신규 논문 가운데 Snap CAMIE 한 편만 정독 기준을 통과했다 — arXiv

자료 arXiv cs.IR daily digest — 2026-09-02 조회 시점 최근 30건.

배경 이 저장소는 매일 cs.IR 신규 제출을 triage해서, 다음 세 조건을 갖춘 논문만 원문을 정독한다.

  • 플랫폼 기업 저자·프로덕션 A/B 진술이 있다.
  • 피드·랭킹·retrieval의 새 메커니즘이다.
  • 대규모 스케일 결과다.

CLAUDE.md의 정본 지침에 따르면 대부분 탈락이 정상이고, 하루 0~2건이 통과한다. 이번 조회에서는 최근 30건 가운데 1건이 통과했다.

새로 알게 된 것A. Snap이 광고 지면 I2I retrieval 논문 CAMIE에서 프로덕션 배포를 밝혔다

  • Snap이 광고 지면의 I2I(item-to-item) retrieval을 다룬 CAMIE 논문을 내고, abstract에서 프로덕션 배포를 진술했다 확인 — arXiv 2608.30255, 2026-08-31 제출.
    • 대상 지면은 Snap Dynamic Product Ads(DPA)로, 광고 지면이다.
    • 다루는 문제는 별개로 학습된 시각/텍스트/멀티모달 인코더가 임베딩 공간을 분절시키고, co-engagement 신호(같은 유저가 두 상품을 함께 본 관계)를 반영하지 못한다는 것이다.
    • 저자는 12명이고, HTML 본문은 전원을 Snap Inc. 소속으로 적는다(Xiaodong Liu, Siman Wang, Congfei Zhang, Hsiang-wei Chao, Xiao Bai 외) 확인 — arXiv 2608.30255.
    • radar.md에 관찰 항목으로 추가했다.

새로 알게 된 것B. 나머지 29건은 기준을 통과하지 못했다

  • 통과하지 못한 유형은 대체로 셋이었다.
    • benchmark/vector quantization/RAG evaluation 같은 방법론 연구다. 플랫폼 기업의 프로덕션 진술이 없다.
    • POI/의료/과학 문헌 등 도메인이 제한된 자료다. 수용 기준에서 명시적으로 제외한다.
    • 저자 소속을 확인할 수 없는 e-commerce SID(semantic ID) 실험이다. Preference Shapes Relevance·ICEGR 등이 여기에 속하고, PailitaoGR과 비슷한 스레드지만 프로덕션 진술이 없다.
  • 흥미로운 인접 자료 두 편만 포인터로 남긴다.
    • arXiv 2608.30251의 SetMIR는 multi-interest retrieval as set prediction 논문이다. 저자는 같은 Snap 그룹(Xiaodong Liu, Siman Wang, Congfei Zhang, Hsiang-wei Chao, Xiao Bai)이다. abstract만으로는 Snap 프로덕션 진술이 명시적이지 않아 정본에는 반영하지 않는다.
    • arXiv 2608.30466의 CHASE는 LLM 기반 retrieval에서 GEO(Generative Engine Optimization)가 콘텐츠를 균질화하는 효과를 다룬다. 추천 랭킹과 인접한 이슈지만 플랫폼 기업 저자가 아니므로 레이더에도 반영하지 않는다.

정본 반영 radar.md의 이번 달 신규에 CAMIE(Snap) 항목을 추가했다.

의미 Snap이 광고 I2I retrieval에서 프로덕션 진술을 낸 사례는 최근 사이클에서 흔치 않다. Snap이 이 라인에서 스레드를 이어 갈지, 단발 진술로 그칠지는 다음 사이클에서 지켜봐야 한다.

레이더

  • Snap CAMIE(arXiv 2608.30255)는 Snap Dynamic Product Ads의 I2I 광고 retrieval에 co-engagement-aware multimodal item embedding을 배포했다. abstract에서 프로덕션 배포를 진술한다. radar.md의 이번 달 신규에 추가했다.

다음에 볼 것