- 읽은 자료 1건
- 정본 반영 2개 파일
- 레이더 0건
1소스별 같은 비율로 후보를 줄이는 필터가 켜졌다 — X
자료 xai-org/x-algorithm@989fb91 — xAI 공개 저장소, 2026-10-22 06:49 UTC 커밋, 코드. 이 노트들이 붙인 번호로는 4세대+47이다. 4세대+N은 이 노트들이 4세대 공개(2026-08-13) 뒤의 X 커밋에 차례로 붙인 번호다. 크론 미러(프로덕션 feature-switch 기본값을 매일 동기화해 공개하는 파일)의 sync 시각은 2026-10-21T16:00:32Z다. 바뀐 파일은 80개이고 +3,436/−1,462줄이며, 그 가운데 절반 이상은 visibility-filtering의 hydration 계층 정리다.
배경 X For You는 여러 소스에서 모은 후보를 Phoenix(Grok 기반 랭킹 트랜스포머)에 보내 점수를 받는데, 한 요청에 채점할 수 있는 후보는 2800개로 정해져 있다. 하루 전 커밋(4세대+46)은 후보가 이 예산을 넘으면 served type(후보가 들어온 소스 경로)마다 같은 비율만큼 줄이는 필터를 기본 off로 추가했다. 그 전까지는 이어 붙인 후보 목록의 앞 2800개만 보내서, 목록 뒤쪽에 붙은 소스가 전부 잘릴 수 있었다. 이번 커밋은 크론 미러에서 이 필터의 스위치를 켜고, 신규 유저용 soft NSFW 필터와 반응 포스트의 안전 규칙을 새로 넣는다.
새로 알게 된 것A. 소스별 같은 비율 필터가 이 커밋의 크론 미러부터 기본 on이다
EnableFairShareRanking의 미러 기본값이 false에서 true로 바뀌었다 확인 —home-mixer/params/param.rs:1206-1211.param!( EnableFairShareRanking, bool, "rust_home_mixer_enable_fair_share_ranking", true );필터의 위치는 그대로 스코어링 전 필터 목록의 맨 끝이다 확인 —
phoenix_candidate_pipeline.rs:443.그래서 이제 예산을 넘는 요청에서는 목록 뒤쪽 소스가 모두 잘리는 대신 소스마다 같은 비율이 잘린다 추정. 근거는 필터의 예산이 Phoenix 요청이 자르는 상한 2800과 같고, 테스트가 소스별 같은 비율을 고정한다는 점이다(daily 2026-10-22).
미러 값은 프로덕션 기본값일 뿐이고, 실험 버킷별 override는 공개 코드에 없다 확인 — x.md 가중치 미러의 caveat. 따라서 모든 트래픽에서 켜졌다고 단정하지 않는다.
새로 알게 된 것B. 가입 하루 미만 유저에게 soft NSFW OON 포스트를 빼는 필터가 기본 off로 생겼다
- 켜지면 계정 나이가 하루 미만인 뷰어의 For You에서 soft NSFW(노골적이지 않은 성적 콘텐츠) 라벨이 붙은 OON(뷰어가 팔로우하지 않는 계정의) 포스트를 뺀다 확인 —
filters/new_user_soft_nsfw_filter.rs.- 스위치
EnableNewUserSoftNsfwFilter는 false이고, 계정 나이 상한NewUserSoftNsfwFilterMaxAccountAgeSecs는 86400이다 —params/param.rs:804-815. - 계정 나이는 유저 ID(snowflake)에 든 생성 시각으로 계산한다. topic 요청과 Following, 점수만 내는 요청에는 걸리지 않는다.
- 목록에서는
CoreDataHydrationFilter바로 뒤에 들어갔다 —phoenix_candidate_pipeline.rs:416.
- 스위치
- 라벨은 새 hydrator가 VF(visibility-filtering, 포스트마다 보여도 되는지 판정하는 안전 계층)의 safety label 서비스에서 받아 온다 확인 —
candidate_hydrators/new_user_soft_nsfw_label_hydrator.rs.- 팔로우한 계정과 자기 포스트, 이미 라벨이 있는 캐시 후보는 조회하지 않는다.
- 조회가 실패하거나 라벨을 모르면 포스트를 남긴다. 테스트
lookup_failure_keeps_the_post와failed_call_keeps_every_post가 이 fail-open(판정이 없으면 통과시킴)을 고정한다.
- 신규 유저용 OON 필터는 이제 참여 임계 필터와 이 필터의 두 개다 확인. 새 유저의 첫날 피드에서 경계선 성적 콘텐츠를 OON 추천으로 보여 주지 않으려는 장치로 본다 추정. 근거는 대상이 OON만이고 나이 상한이 하루라는 점이다.
새로 알게 된 것C. 반응 포스트가 원본 포스트의 안전 라벨을 물려받게 됐다
- 원본 포스트에 성인 콘텐츠나 폭력 라벨이 있으면, 그 원본에 반응해 올린 포스트도 blur(경고 화면 뒤에 가림) 처리한다 확인 —
visibility-filtering/rules/tweet_rules.rs.- 성인 쪽은
NSFW_HIGH_PRECISION라벨을, 폭력 쪽은GORE_AND_VIOLENCE_HIGH_PRECISION과GORE_AND_VIOLENCE_REPORTED_HEURISTICS라벨을 본다. - 두 라벨이 함께 있으면 성인 쪽 blur가 이긴다. 반응 포스트 자체에 폭력 라벨이 있어도 원본의 성인 라벨이 먼저 적용된다.
- 성인 쪽은
- 원본 작성자가 비공개 계정이면 반응 포스트를 뺀다 확인 — 같은 파일의
PROTECTED_ORIGINAL_AUTHOR_DROP. - 세 규칙은 SafetyLevel(VF가 지면별로 쓰는 규칙 묶음) 가운데
TimelineHomeHydration에만 들어갔다 확인 —rules/levels.rs.- golden corpus(규칙별 기대 판정을 고정한 테스트 표)는 같은 포스트가
TimelineHome에서는 허용됨을 함께 고정한다 —rules/golden_corpus/reaction_video.rs.
- golden corpus(규칙별 기대 판정을 고정한 테스트 표)는 같은 포스트가
- 원본 라벨이나 작성자 조회가 실패하면 반응 포스트를 그대로 보여 준다 확인 —
rules/rule_spec/laws.rs.
"the default shows the reaction post unblurred, as Tweetypie does on a failed lookup" — visibility-filtering/rules/rule_spec/laws.rs, 2026-10-22 (코드 주석)
새로 알게 된 것D. 영상 캐러셀은 아래로 스크롤해 받는 요청에는 나오지 않는다
- 캐러셀은 이제 BOTTOM 커서 요청(피드를 아래로 스크롤해 더 받는 요청)에서 꺼진다 확인 —
home-mixer/util/video_carousel.rs:11-23.- 캐러셀을 넣는 조건과 immersive 점수로 정렬하는 조건에
!query.is_bottom_request가 붙었다. is_bottom_request는 서버가 요청 커서 종류가CursorType::BOTTOM일 때 true로 둔다 —home-mixer/server.rs:404.
- 캐러셀을 넣는 조건과 immersive 점수로 정렬하는 조건에
- 캐러셀 영상의 위치와 점수를 Kafka로 남기는 side effect(응답을 바꾸지 않고 로그만 남기는 단계)의 스위치가 기본 on이 됐다 확인 —
params/param.rs:1162-1167. - 캐러셀 자체의 스위치
EnableVideoCarousel은 이 커밋에서도 false다 확인 —params/param.rs:1120-1125. 그래서 두 변경은 캐러셀이 켜진 실험 트래픽에서만 효과가 있다 추정.
새로 알게 된 것그 밖의 변경
- 섀도 트래픽(실험 Phoenix 클러스터에도 채점을 보내고 점수는 로그로만 남기는 경로)에서 opt-in 클러스터
Experiment18Fou가 0.5를 받게 됐다 확인 —params/param.rs:97-102. 기본값 이름이ShadowTrafficDefaultPercent라 단위는 퍼센트로 본다 추정. - 가중합 점수가 음수인 후보의 비율을 served type별로 세고, 음수가 not_interested 항 때문인지 나누는 메트릭이 생겼다 확인 —
side_effects/scored_stats_side_effect.rs. - Phoenix retrieval이 뷰어가 뮤트하거나 차단한 작성자의 포스트를 몇 개 가져오는지 세는 메트릭이 생겼다 확인 —
sources/phoenix_source.rs. - VF 클라이언트와 safety label 클라이언트를 서버에서 한 번 만들어 For You와 Following 파이프라인이 함께 쓰게 됐고, label 조회 배치 크기는 50에서 100이 됐다 확인 —
home-mixer/server.rs. - Phoenix 랭커에 상위 K개 트랜스포머 층에서 이력 토큰을 고정하고 후보 토큰만 갱신하는 학습 옵션이 생겼다 확인 —
phoenix/xrex/models/transformer.py. 기본값은 빈 튜플이라 꺼져 있다. - immersive 지면 two-tower(유저와 포스트를 따로 임베딩하는 retrieval 모델) 학습에 4일, evergreen, NSFW 슬라이스 평가와 슬라이스별 recall@600이 더해졌다 확인 —
phoenix/xrex/configs/xrecsys_two_tower.py. - grox(Grok 기반 주석 파이프라인)에 모든 영상을 최고 비트레이트로 받는 설정이 기본 false로 생겼다 확인 —
grox/config/config.py. - visibility-filtering의 hydration 저장소와 정책 고정 테스트가 정리됐고, 이 부분에서 판정 규칙은 C 외에 바뀌지 않았다 추정. 근거는 규칙 정의 파일의 diff가 C의 세 규칙뿐이라는 점이다.
정본 반영 services/x.md를 다음과 같이 고쳤다.
## 한 줄 요약의 기준 커밋을 989fb91로 올리고 스코어링 전 필터 수를 22개로 고쳤다.## 재순위·다양성·필터도입에 필터 수 27개와 같은 비율 필터가 기본 on이라는 문장을 넣었다.- 필터 절에서 목록에
NewUserSoftNsfwFilter를 넣고,FairShareRankingFilter의 상태를 기본 on으로 고쳤다. ## 콜드스타트신규 유저 절에 soft NSFW 필터 불릿을 더했다.## 피드 지면캐러셀 불릿에서 Kafka 로그 스위치를 기본 on으로 고치고 BOTTOM 요청 제외를 더했다.- 안전성 절 도입 뒤에 반응 포스트 규칙 단락을 더했다.
## 출처의 확인 시점과 커밋 표를 989fb91까지 올렸고, 변경 이력 요약표에 4세대+47 행을 추가했다.assets/x-pipeline.svg의 필터 상자를 "필터 22, 2026-10-22 커밋 기준"으로 고쳤다.
의미 ⚠ 주장 변경: 어제 노트가 "기본 off"라고 적은 소스별 같은 비율 필터는 하루 만에 미러 기본값이 on이 됐다. 이제 Phoenix가 채점하는 후보 구성이 목록 순서보다 소스별 비중을 따른다 추정. topics와 radar에는 이 필터를 다룬 문장이 없어 함께 고칠 곳이 없었다.
다음에 볼 것
- 같은 비율 필터가 켜진 뒤 served type별 메트릭이나 소스 상한이 조정되는지 본다 — 소스별 점유율 변화는 아직 추정이다.
- 신규 유저 soft NSFW 필터와 영상 캐러셀이 켜지는지 본다 — 둘 다 기본 off다.
- 섀도 트래픽 비율의 단위를 shadow.rs의 is_sampled 구현으로 확인한다 — 퍼센트라는 해석은 추정이다.
조회 현황
- X: xai-org/x-algorithm에 새 커밋 1건(989fb91)이 있었다. 릴리스는 확인하지 않았다.
- Meta: engineering.fb.com RSS의 최신 글은 2026-10-19자로, 이미 확인했다. ai.meta.com/blog와 transparency.meta.com은 이번에 확인하지 않았다.
- Netflix: RSS에 2026-10-22자 새 글 1건(Single-tenant Titus)이 있었고, 컨테이너 격리 인프라 글이라 건너뛰었다. research.netflix.com/publications는 확인하지 않았다.
- arXiv cs.IR: 30건을 파싱했고, 2026-10-21 제출분이 새로 들어왔다. 통과는 0건이다. 생성형 추천의 롱테일 복원(CAPE)과 적응형 재귀 순차 추천(LoopRec)은 공개 벤치마크뿐이라, 검색 CTR의 SID 사전학습(FineSID)은 피드가 아닌 검색 지면이라 탈락시켰다.
- WebSearch 교차 확인은 이번에 하지 않았다.