1. X 알고리즘 4세대 드랍 — 가중치·SimClusters·visibility-filtering·labeling 파이프라인 통째 공개 (⚠ 테제 대량 변경)
자료 xai-org/x-algorithm @ 47c1bcd — "Open-source X Recommendation Algorithm" — 2026-08-13 17:09 UTC (뒤이어 .gitattributes 정리 a389166), 공개 소스코드. 커밋 하나로 +363,246 / −11,640 (총 파일 300개+, GitHub API 페이지네이션 한계로 정확한 파일수는 트리에서 재구성). README.md #latest-update--august-13th-2026, docs/BIDIRECTIONAL_BOOST_CHANGE.md, home-mixer/params/param.rs, visibility-filtering/rules/registry.rs.
배경
이 저장소의 services/x.md는 지난 3개월 동안 "공개 소스 3세대"를 정본으로 유지해 왔다 — 2023 Scala 초판 → 2025 Scala 리프레시(c54bec0, tweet-mixer 신설) → 2026 Rust 재작성(aaa167b·e414c17·0bfc279, 총 216파일). 그리고 정본의 가장 큰 미해소 절이 두 개 있었다.
첫째, 가중치. 목적함수의 형태(가중합)는 확인됐지만 실제 값은 세 세대 어디에도 없었다. 2026 Rust에서는 crate::params 모듈 자체가 레포에서 빠져 있어 FavoriteWeight 같은 심볼이 호출부에만 있고 정의가 없었다. 널리 인용되는 "reply 13.5 / good_profile_click 12.0 / report −369" 표는 2023-04-05 스냅샷 하나뿐이고, 그것도 저자가 직접 "프로덕션과 작은 차이 있을 수 있다"고 단서를 붙여 놓은 문서였다.
둘째, 안전성/visibility-filtering·labeling 파이프라인. 홈미서 코드에는 VFFilter·AncillaryVFFilter가 fail-closed로 걸려 있었지만, 그 필터가 참고하는 라벨을 누가 언제 어떻게 붙이는가는 완전한 블랙박스였다. grox/ 서브레포는 부분 공개(주석 파이프라인 골격만), 그 외 계정 레벨 판단·PageRank·인위적 행동 탐지·NSFW 미디어 분류·규칙 엔진·집행 서비스는 아예 언급이 없었다.
이번 드랍이 두 절을 통째로 뒤집었다. 새 README가 **"Adds key configuration parameters (including weights used to blend predicted action values into a score for a post)"**로 시작해 home-mixer/params/param.rs 1084줄이 새로 붙었고, **"Adds code for systems that impact whether a post is filtered from the For You feed"**로 이어 서브시스템 15개+가 신설됐다. Phoenix는 학습 코드·synthetic 데이터 생성기·QUICKSTART까지 얹혀 end-to-end 실행 가능해졌고, 새 SimClusters 서브레포가 홈미서의 OON retrieval 소스로 배선됐다.
새 README가 커밋 메시지에서 자평하듯 이 릴리즈의 성격은 이제 "로직의 형태를 보여주는 것"에서 "값과 규칙을 검증 가능한 형태로 붙이는 것"으로 넘어왔다. 그와 짝으로 x.com/i/under_the_hood 라는 계정 단위 라벨 투명성 툴이 파일럿 공개됐다 — 유저가 자기 계정과 포스트에 붙은 visibility 라벨을 조회할 수 있고 그 라벨 → 이 레포 코드로 왜 그런 취급을 받는지를 대조할 수 있게 설계됐다는 것이 새 README의 주장이다.
새로 알게 된 것 — 가중치
home-mixer/params/param.rs가 코드에 박힌 프로덕션 기본값을 담는다. 파일 헤더의 주석이 이 파일의 성격을 정확히 규정한다:
// mirrored from config feature-switch defaults; last sync 2026-08-12T04:09:22Z—home-mixer/params/param.rs:1
새 README의 "Experiments and Configuration" 절이 이 미러링의 의미를 못박는다:
"To help people understand the production defaults, we run cron scripts that set the defaults in this repository's code to be the primary production values, for example in
home-mixer/params/param.rs." — README.md#experiments-and-configuration
즉 이 파일의 숫자는 "예시"나 "데모 기본값"이 아니라 프로덕션 primary value를 크론이 매일 밀어 넣는 미러다. 정확도의 상한은 마지막 sync 시각(2026-08-12 04:09 UTC).
엔게이지먼트 헤드 가중치 (26개, 정렬은 파일 등장 순) [확인] — 위 URL:
| 헤드 | param 심볼 | 기본값 | 비고 |
|---|---|---|---|
| favorite | FavoriteWeight |
0.5 | 2023-04-05 스냅샷의 0.5와 일치 |
| reply | ReplyWeight |
5.0 | 2023 스냅샷의 13.5와 상이 |
| ↳ +상호팔로우 원본 boost | BidirectionalFollowReplyWeightBoost |
15.0 | 2026-07-13 도입 20 → 2026-07-24 15로 하향 (아래 사례 참조) |
| retweet | RetweetWeight |
1.0 | 2023 스냅샷과 일치 |
| photo_expand | PhotoExpandWeight |
0.05 | |
| video_open | VideoOpenWeight |
0.05 | |
| click (포스트) | ClickWeight |
0.4 | 2023 good_click 11·good_click_v2 10과 스케일 상이 — 다른 헤드일 가능성 |
| open_link | OpenLinkWeight |
0.2 | |
| profile_click | ProfileClickWeight |
0.0 | 2023 스냅샷 good_profile_click 12에서 완전 제거 |
| video quality view (vqv) | VqvWeight |
0.05 | |
| share | ShareWeight |
2.0 | |
| share via DM | ShareViaDmWeight |
5.0 | |
| share via copy link | ShareViaCopyLinkWeight |
20.0 | 최고 양수 개별 헤드 |
| dwell | DwellWeight |
0.0 | 실전 dwell 신호는 연속형 아래 |
| ↳ +상호팔로우 원본 boost | BidirectionalFollowDwellWeightBoost |
0.0 | 코드는 있으나 미배포 |
| quote | QuoteWeight |
5.0 | |
| quoted_click | QuotedClickWeight |
0.05 | |
| quoted_vqv | QuotedVqvWeight |
0.0 | |
| follow_author | FollowAuthorWeight |
4.0 | |
| post_unexplored | PostUnexploredWeight |
0.02 | 새-작성자 부스트, 아래 참조. PostUnexploredWeightInNetworkOnly = true |
| 연속형 dwell time | ContDwellTimeWeight |
0.004 | |
| 연속형 click dwell time | ContClickDwellTimeWeight |
0.0 | |
| 연속형 active_secs 5분 residual | ContActiveSecs5mResidualNormWeight |
0.0 | 새 README "Attention" 카테고리 |
부정 헤드 가중치 (5개) [확인]:
| 헤드 | param 심볼 | 기본값 | 2023 스냅샷 대응 |
|---|---|---|---|
| not_interested | NotInterestedWeight |
−43.2 | 대응 없음 (당시 없던 헤드) |
| block_author | BlockAuthorWeight |
−31.2 | 대응 없음 |
| mute_author | MuteAuthorWeight |
−58.8 | 대응 없음 |
| report | ReportWeight |
−234.0 | 2023 report −369 → 완화 방향 |
| not_dwelled | NotDwelledWeight |
−0.02 | 대응 없음 (canon이 유일하게 잡아냈던 새 부정 헤드) |
파일 헤더 위 주석 세 줄이 부호·크기 규모의 의미를 규정한다:
"These weights reflect a combination of how much an action is valued in ranking and typical propensities of these actions across the X network (e.g. negative feedback is overall rare)." —
home-mixer/params/param.rs:281
즉 report −234의 크기는 "리포트 한 번의 상대 중요도"가 아니라 가치 × 1/propensity의 곱이다 — 리포트가 워낙 드무니까 큰 절대값이 붙어 있는 것.
새로 알게 된 것 — 가중치 밖 상수
정본이 오래 "네 값 전부 비공개"라고 못박아 왔던 OON 배수·다양성·VMRanker 상수가 전부 나왔다:
OonWeightFactor = 0.75[확인]— OON 포스트에 곱하는 감쇠 (2023-04-05 스냅샷의out_of_network_scale_factor0.75와 일치)TopicOonWeightFactor = 0.5[확인]— 토픽 요청일 때 더 엄격NewUserAgeThresholdSecs = 0[확인]— 신규 유저 라우팅 임계가 0초라는 것은 사실상 코드 경로가 비활성 상태로 미러링돼 있다는 뜻[추정]AuthorDiversityDecay = 0.5,AuthorDiversityFloor = 0.25,EnableAuthorDiversity = true[확인]— 같은 작성자의 2번째 포스트에는(1−0.25)·0.5¹+0.25=0.625배, k번째에는 (1−0.25)·0.5ᵏ+0.25 배가 곱해진다VMRankerDppTheta = 0.65,VMRankerDppMaxSelectedRank = 150,EnableVMRanker = true,VMRankerValueModelId = "dpp",VMRankerClusterId = "Experiment3",VMRankerEnableFallback = false[확인]— 정본이 남긴 열린 질문 "VMRanker/DPP가 켜져 있는가" 에 대한 직접 답: 켜져 있다, DPP를 씀, 폴백 없음. 즉 실패 시 fail-open 조용 스킵이라는 canon 관찰이 그대로 유효PhoenixMaxResults = 1000,ThunderMaxResults = 1200,TweetMixerMaxResults = 800,EnableTweetMixerSource = false,EnableSimclustersSource = true,EnablePhoenixSource = true[확인]— 레거시 tweet-mixer는 기본 off로 미러링됐다. SimClusters가 그 자리를 대체ShadowTrafficDefaultPercent = 0.3[확인]— 새 Phoenix 클러스터에 30% shadow 트래픽이 기본ColdStartImpressionThreshold = 1000[확인]— canon이 "신규 아이템에 아무 장치 없다"고 했던 지점 — 실은 임프레션 임계로 정의된다. 임프레션 1000회 미만이면 "새 작성자/포스트"로 분류. 아래PostUnexploredWeight로 부스트
새-작성자 부스트 (New-Author Boost) — 세 번째 조정 인자 [확인] — README.md #scoring-and-ranking:
새 README가 스코어링 조정 인자를 세 개로 명시한다:
"Author Diversity ... Out-of-Network Discount ... New-Author Boost: posts from authors whose impressions are below a threshold are lifted toward a target position." — README.md
#scoring-and-ranking
정본은 조정 인자를 (1) 작성자 다양성 감쇠 (2) OON 배수 두 개로만 기록해 왔다. 세 번째로 새-작성자 부스트가 있고, param.rs에 PostUnexploredWeight = 0.02·PostUnexploredWeightInNetworkOnly = true·EnableMultiplicativePostUnexplored = false·MultiplicativePostUnexploredAlpha = 0.0·ColdStartImpressionThreshold = 1000로 정의된다. 즉 기본은 가산형 부스트고 곱셈형은 비활성, 인네트워크에만 적용. [확인]
새로 알게 된 것 — 파이프라인 구조
정본이 오래 "SimClusters, TwHIN, UTEG/GraphJet, FRS, Earlybird, Lists, Communities — 이 이름들은 home-mixer/ 어디에도 안 나온다"고 못박아 왔다. SimClusters가 뒤집혔다. 새 README:
"In-Network
thunder/keeps recent posts from the accounts a viewer follows in memory · Out-of-Networkphoenix/retrieval andsimclusters/find posts from accounts the viewer does not follow" — README.md#overview
즉 후보 소스가 Thunder(인네트워크) + Phoenix retrieval + SimClusters + (기본 off된 tweet-mixer 레거시) 로 재편됐다. SimClusters 서브레포가 새로 생겼고, simclusters/ 코어 알고리즘(SVD 기반 sparse 저차원 임베딩, 2020 KDD)이 여기 들어와 있다는 뜻이다. 세부는 simclusters/ 통째 심층 분석 필요.
필터도 14 → 17로 늘었다 [확인] — README.md #filtering:
새 3개 필터가 붙었다.
OONRetweetReplyFilter— 팔로우 안 하는 계정의 리트윗·답글 + 부모 없는 답글 (기존RetweetDeduplicationFilter와 별개)OONNsfwSimclustersFilter— SimClusters 소스에서 나온 성인 컨텐츠 계정의 포스트를 팔로우 안 하는 유저에게 드롭. SimClusters 도입에 짝지어 신설된 필터NewUserMinEngagementFilter— 신규 유저에게 OON 포스트 중 참여 임계 미달인 것 제거. 관련 param:NewUserMinEngagementThreshold,NewUserMinEngagementFilterMetric,NewUserMinEngagementFilterUseRatio,NewUserMinEngagementFilterMaxAccountAgeSecs,NewUserMinEngagementFilterMaxResurrectionAgeSecsInventoryHoldoutFilter— 결정론적 유저×포스트 해싱으로 설정된 %의 인벤토리를 홀드아웃 (정본 미기재였고 canon이 놓친 필터)
canon이 기록한 BackupFilter no-op, TopicIdsFilter 하드코딩 supertopic 등의 관찰은 유효.
새로 알게 된 것 — 예측 헤드 (문서상) 24개
새 README가 헤드를 카테고리 5개, 총 24개로 재배치했다 [확인] — README.md #scoring-and-ranking:
- Engagement (7): favorite · reply · repost · quote · share · share via DM · share via copy link
- Clicks (6): post · profile · link · photo expand · video open · quoted post
- Attention (5): video quality view · dwell · dwell time · click dwell time · active seconds
- Author (1): follow author
- Negative (5): not interested · mute author · block author · report · not dwelled
정본은 세 가지 헤드 카운트가 갈린다고 기록해 왔다 — 공개 체크포인트 19 / Rust 스코어러 22 / VMRanker proto 21. 새 README는 문서 상 24를 못박고, param.rs의 weight 심볼도 25개(공제 = 헤드 예측값이 아닌 heuristic weight)와 일치. 소스 코드 상 실 개수는 새 phoenix 학습 코드 심층 분석 필요.
새로 알게 된 것 — visibility-filtering 서브레포
visibility-filtering/rules/registry.rs 912줄이 정책 세 개를 정의한다: FilterAll(모든 것 드롭), TimelineHome(팔로잉 대상 기본 규칙), TimelineHomeRecommendations(추천 대상 = 기본 규칙 + OON 전용 드롭). [확인]
base_home_rules() — 팔로잉·추천 공통 28개 규칙 [확인]:
계정 상태(SUSPENDED_AUTHOR_DROP, DEACTIVATED_AUTHOR_DROP, ERASED_AUTHOR_DROP, OFFBOARDED_AUTHOR_DROP, ProtectedAuthorDropRule) → 뷰어 관계(ViewerBlocksAuthorRule, ViewerMutesAuthorRule, MutedRetweetsRule) → 트윗 라벨(PDNA_DROP, BOUNCE_DROP, SPAM_DROP, FOR_EMERGENCY_USE_ONLY_DROP, FOSNR_HATEFUL_CONDUCT_DROP, FOSNR_VIOLENT_SPEECH_DROP, FOSNR_ABUSE_DROP, FOSNR_CIVIC_INTEGRITY_DROP) → 트윗 상태(NullcastedTweetDropRule, DropStaleTweetsRule, DropLegalTakendownPostRule, DropLocalLawsTakendownPostRule) → NSFW 뷰어 게이팅(SensitiveViewerLoggedOutDropRule, SensitiveViewerUnderageDropRule, SensitiveViewerNoStatedAgeDropRule) → 배제 트윗(DropExclusiveTweetContentRule) → NSFW 인터스티셜(NSFW_HIGH_PRECISION_INTERSTITIAL, GORE_AND_VIOLENCE_INTERSTITIAL, NSFW_CARD_IMAGE_INTERSTITIAL, NsfwAuthorInterstitialRule).
timeline_home_recommendations_policy() — 위 28개 + OON 전용 26개 추가 = 54개 [확인]:
DMCA/지리 제한 미디어(2) → NSFW 계정(4) → NSFW/폭력/DoNotAmplify/스팸 라벨 트윗(9) → NSFW/스팸/impersonation/deactivated/adult 관련 유저 라벨(11).
정본이 canon 함정 절 #2에서 이미 관찰했던 "인네트워크와 OON에 다른 안전 레벨"의 실체가 여기 있다 — 팔로잉 유저에게는 28개 규칙만, OON 추천에는 54개 규칙. 첫 번째 드롭 판정에서 평가 종료(short-circuit), 그리고 OON 전용 규칙군은 캐치업 드롭만 가능하고 인터스티셜/알로우는 없음(canon 함정 #2와 일치).
canon 함정 #1 (fail-closed)의 실체 확인. visibility-filtering/rules/registry.rs의 정책 반환값은 Verdict 구조체지만, README가 interstitial은 UI 처리로 넘기고 drop이 실제 필터링이라고 명시. [확인] README.md #labeling-path:
"interstitial ──► the post stays in the feed; nothing in this repository draws the interstitial"
새로 알게 된 것 — labeling 파이프라인
새 README가 4단계 "Labeling Path"로 정리한다: Content Understanding → Labeling Rules → Storage → Visibility Filtering. 각 서브시스템의 역할이 처음 공식 문서화됐다 [확인]:
grox/— nearline 컨텐츠 분류기. 정본에는 이미 부분 반영media-model-proxy/— 이미지·비디오 모델(NSFW, 폭력/고어, 혐오 심볼, 주제 분류, 알려진 미디어 매칭) 서빙 프록시clip/— CLIP 이미지·텍스트 임베딩 모델 학습 (미디어 분류기 입력)adult-content/— 성인 미디어 분류기 학습·캘리브레이션pnsfwmedia/— CLIP 임베딩 + 계정 스코어 결합 성인 미디어 판별기agatha/— 오프라인 배치. 다른 계정이 이 계정 포스트에 어떻게 반응했나 기반 라벨(블록·리포트·스팸 리포트 대비 favorite 비율)bdsm/— 계정의 시계열 행동 시퀀스에서 inauthentic/abusive 신호 추출 (Rust + proto + training + tests 서브디렉토리)user-cred-v2/— 팔로우+엔게이지먼트 엣지 위 PageRank로 계정 신뢰도 스코어scarecrow/— 이벤트 반응형 규칙 러너.botmaker/를 규칙 엔진으로 임베드botmaker/— 규칙 DSL·컴파일러·런타임botmaker-rules/— scarecrow가 로드하는 실제 규칙 (일부는 게이밍 방지 목적 미공개)abuse-enforcement-service/— 모델 스코어 기반 계정 조치(라벨링·챌린지·서스펜션)safety-label-user-agg/— 계정 소유 포스트가 받은 라벨을 계정 레벨로 집계visibility-filtering-client/— visibility-filtering 서비스 클라이언트 라이브러리under-the-hood/— 계정 단위 라벨 투명성 리포트 빌더 (일일 배치 + 서빙 층 집계)
이 15개 서브시스템은 오늘까지 canon에 한 줄도 안 들어와 있었다.
새로 알게 된 것 — Phoenix가 실행 가능해졌다
새 README:
"Elsewhere, code may not necessarily include build- or deployment-related files or generally self-explanatory infrastructure imports (e.g.
xai_service_runnerorxai_kafka). ...phoenix/ships a Cargo workspace, apyproject.toml, a quickstart and synthetic data generation, so a small model can be trained and served end-to-end." — README.md#deployment-related-code
정본이 canon 함정 절 #1에서 관찰했던 "레포 전체가 빌드되지 않는다"의 부분 해소. Phoenix만은 학습·서빙까지 end-to-end 실행 가능한 형태로 배포됐다. 나머지 크레이트는 여전히 crate::params·crate::util·crate::clients·xai_service_runner·xai_kafka 등의 미공개 의존이 남아 있다. [확인] — 새 커밋의 Cargo.toml 개수는 여러 개 (phoenix 서브트리에 집중).
Phoenix retrieval을 위한 새 인덱스 서비스도 열렸다 [확인] — README.md #retrieval-index:
phoenix-rankall/— Phoenix retrieval이 조회하는 포스트 인덱스 유지. 이벤트 도착에 따라 업데이트phoenix-rankall-strato/— 어떤 인덱스에 포스트가 속하는지 결정하는 이벤트 층. visibility-filtering을 먼저 참조함
즉 인덱싱 파이프라인이 랭킹 쪽 visibility 규칙과 이미 sync — 인덱스에 들어가기 전에 이미 visibility 판단이 붙는다. 이건 정본이 완전히 몰랐던 아키텍처 사실이다.
⚠ 이 진술을 다룰 때 반드시 붙일 caveat 다섯 가지
- 가중치 크론 sync는 매일 밀리는 미러라 시차가 있다. 헤더가 밝히는 sync 시각 이후의 프로덕션 변경은 아직 반영 안 됐을 수 있다.
[확인] - 가중치 부호·크기의 해석은 propensity를 감안해야 한다. 파일의 자체 주석이 "값 = 가치 × 1/propensity"라고 명시. 즉 리포트 −234와 favorite 0.5의 절대값 비율(468배)이 그대로 "리포트가 favorite보다 468배 중요"를 뜻하는 게 아니다.
- 미러링 범위는
home-mixer안 param만이다. VMRanker 원격 서비스의 내부 상수, phoenix 학습 hyperparameter, botmaker 규칙 상수,crate::util안 상수(score normalizer, vqv weight 임계 등)는 여전히 레포 밖.[확인] - Phoenix 학습 코드는 "학습 가능한" 것이지 "프로덕션과 같은" 것이 아니다. README가 명시적으로 *"a small model can be trained and served end-to-end"*라고 규모를 다르게 못박음. 실 프로덕션 checkpoint·데이터·infra는 미공개.
- 일부 botmaker rules는 게이밍 방지 목적 미공개. README가 명시. 즉 visibility-filtering이 참조하는 라벨 중 어떤 것들은 규칙이 열려 있지 않다.
[확인]
새로 알게 된 것 — 실제 파라미터 변경 사례 문서화
새 파일 docs/BIDIRECTIONAL_BOOST_CHANGE.md가 향후 코드 diff로 파라미터 변경을 어떻게 문서화할지의 견본을 제시한다. 사례는 양방향 팔로우 답글 부스트 (2026-07):
- 2026-07-10 A/B 시작:
BidirectionalFollowReplyWeightBoost값 5/10/15/20 랜덤 배정, 대다수는 0 - 2026-07-13 초기 광범위 롤아웃: 20으로 확장
- 2026-07-24: X에서 유저 피드백(월드컵 진행 중인데 관련 포스트 부족) 반영해 20 → 15로 하향
문서가 그대로 인용하는 요약:
"In plain language, the bidirectional follow boost boosts original posts from people you mutually follow by increasing the weight on the predicted probability that you'll reply to a post from one of those authors who you mutually follow." —
docs/BIDIRECTIONAL_BOOST_CHANGE.md
코드 대응:
home-mixer/candidate_hydrators/bidirectional_follow_hydrator.rs(신규) — SocialGraphClient로 상호팔로우 여부 조회,PostCandidate.is_mutual_follow_author에 세팅home-mixer/models/candidate.rs— 필드 하나 추가home-mixer/scorers/ranking_scorer.rs—bidirectional_boost_eligible(c)정의:in_reply_to_tweet_id.is_none() && retweeted_tweet_id.is_none() && is_mutual_follow_author == Some(true)→ 조건 만족 시 reply/dwell 가중치에 boost 더함- 조건 순수 원본에만, 답글·리트윗 제외, 상호팔로우 아니면 pass-through
즉 원본 포스트에 한해서만 부스트가 붙는다. 답글·리트윗은 대상 아님. 이 규칙은 canon에는 없던 매우 구체적 로직이다. [확인]
정본 반영
- services/x.md 대폭 개정. 주요 변경:
- "공개 소스 3세대" 표에 4세대 행 추가 (2026-08-13, +363k/−12k 라인, 파일 300+, visibility-filtering·labeling 서브레포 15개 신설,
phoenix/학습 코드 포함) - 후보 소스 표에 SimClusters 추가,
TweetMixer기본 off 표시,EnableSimclustersSource=true·EnablePhoenixSource=true값 삽입 - 후보 배분 절 갱신:
TweetMixerMaxResults=800,PhoenixMaxResults=1000,ThunderMaxResults=1200값 삽입,OonWeightFactor=0.75,TopicOonWeightFactor=0.5값 삽입 — canon의 "네 값 전부 비공개"를 "세 값 공개(신규 유저 하나는 임계 0으로 사실상 비활성)"로 재작성 - 랭킹 절: Phoenix 예측 헤드 표를 새 README의 24개 카테고리 배치로 재작성, param.rs의 25개 weight 심볼과 대응
- 가중치 절 전면 재작성 — "결론: 값 미공개"를 "결론: 2026-08-13 이후 프로덕션 미러 공개"로 뒤집음. 상세 표 (favorite 0.5, reply 5.0, +상호팔로우 원본 15.0, retweet 1.0, ..., report −234) 삽입. 2023 스냅샷과의 세부 대비 절 추가
- VMRanker 절:
EnableVMRanker=true,VMRankerDppTheta=0.65,VMRankerDppMaxSelectedRank=150,VMRankerValueModelId="dpp"값 삽입, 열린 질문 "VMRanker/DPP가 켜져 있는가"를 해소로 이동 - 필터 절: 14 → 17로 갱신.
OONRetweetReplyFilter,OONNsfwSimclustersFilter,NewUserMinEngagementFilter,InventoryHoldoutFilter신규 항목 추가 - 새-작성자 부스트 서브절 신규 (Author Diversity Decay·OON Discount에 이은 세 번째 조정 인자)
- visibility-filtering / labeling 파이프라인 신규 절 — base 28 규칙 + OON 추가 26 = 54,
agatha·bdsm·user-cred-v2·pnsfwmedia·scarecrow·botmaker·abuse-enforcement-service·safety-label-user-agg·under-the-hood·clip·media-model-proxy서브레포 표 삽입 - Phoenix 학습·인덱스 신규 절 — Cargo workspace + pyproject.toml + QUICKSTART + synthetic data · phoenix-rankall / phoenix-rankall-strato · 인덱싱이 visibility 판단을 먼저 참조한다는 아키텍처 사실
docs/BIDIRECTIONAL_BOOST_CHANGE.md사례를 "가중치가 어떻게 바뀌는가" 서브절로 반영 (2026-07-10 A/B → 07-13 롤아웃 → 07-24 20→15)- "소스 읽는 법 — 함정 목록"의 canon 함정 #1(레포 빌드 안 됨) 절반 해소 — Phoenix는 이제 빌드된다
- 열린 질문 대량 해소: 가중치 실값 · VMRanker on/off ·
has_cached_posts비중(여전히 미해소) · Phoenix 헤드 개수(24로 확정) · SimClusters 부활 여부(부활) - 새 열린 질문 추가: SimClusters 서브레포 코어 알고리즘 세부(SVD 파이프라인·k) · agatha·bdsm·user-cred-v2 각각의 스코어링 세부·업데이트 주기 ·
phoenix/학습 파이프라인의 loss·negative sampling·optimizer · Under the Hood 툴이 노출하는 라벨 taxonomy · InventoryHoldoutFilter의 홀드아웃 비율 param
- "공개 소스 3세대" 표에 4세대 행 추가 (2026-08-13, +363k/−12k 라인, 파일 300+, visibility-filtering·labeling 서브레포 15개 신설,
- assets/x-pipeline.svg 갱신: (1) 후보 소스에 SimClusters 추가, tweet-mixer 기본 off 표시 (2) 필터 개수 14 → 17 (3) 가중치 절 "값 비공개"를 "정본 참조 (예: reply 5.0 + 상호팔로우 부스트 15.0)"로 수정 (4) 예측 헤드 24로 갱신 (5) VMRanker "실패 시 조용히 스킵"에 "DPP θ=0.65 · K=150 · 기본 on" 값 추가
- radar.md 갱신: 이번 드랍은 추적 서비스(X) 직접 반영이므로 레이더를 거치지 않음(정본에 바로). 아래 arXiv triage 관련 1건만 추가
의미
⚠ 테제 대량 변경. 오늘 이전까지 X 정본의 가장 큰 미해소 절 두 개(가중치 값·labeling 파이프라인)가 하루에 동시에 해소됐다. 이 저장소의 성격상 이런 규모의 canon 재작성은 드물다 — 정본 x.md의 300줄 넘게가 오늘 바뀌었거나 새로 쓰였다.
첫 번째 의미는 연구 방향의 재정렬이다. 지난 3개월간 x.md의 열린 질문들이 다른 서비스(Meta·Netflix)의 관측을 이끌어 왔다 — "X 광고 스택은 어디까지 공개됐나", "SimClusters의 실 부활 여부", "VMRanker DPP의 배포 상태" 같은 질문이 topics/ 노트 여러 개의 방향타였다. 오늘 이 질문들이 답을 얻은 만큼, 이 저장소는 이제 "X가 공개한 값이 왜 이런가 / 다른 회사의 대응 지점은 무엇인가" 라는 다음 층의 질문으로 옮겨간다. 예를 들어 X의 report 가중치 −234와 Netflix GenRec의 catalog softmax는 완전히 다른 손실 함수의 두 극단이고, 이 두 숫자가 나란히 정본에 있다는 사실 자체가 다음 topics 확장의 좌표가 된다.
두 번째 의미는 투명성 아키텍처의 산업 표준화 시작 신호다. docs/BIDIRECTIONAL_BOOST_CHANGE.md가 보여주는 문서화 스타일 — A/B 시작 → 결과 관찰 → 파라미터 조정을 3주 안에 코드 diff로 공개 — 은 다른 회사(Meta·Netflix·YouTube 어느 곳)에서도 지금까지 사례가 없었다. X가 이걸 "example algorithm diff"라고 부르며 반복할 예고를 붙였다면, 비교 가능한 프로덕션 diff 시계열이 처음으로 존재하게 되는 것이다. 이 저장소가 앞으로 X 커밋 로그를 매일 추적하는 것의 가치가 상당히 커진다. 다음 커밋에서 어떤 param이 어떻게 바뀌는지가 곧 A/B 결과의 지연 지표가 된다.
세 번째 의미는 정본 함정 목록의 일부 재조정이다. canon의 함정 #1(레포 빌드 안 됨) 중 Phoenix 부분은 해소됐지만, 나머지(crate::params 이전 판이 지금은 이 파일로 채워짐, crate::util·crate::clients는 여전히 미공개)는 부분적으로만 해소. 함정 #2(README 지목 스코어러 3개가 죽은 파일)는 아직 검증 필요 — 새 릴리즈에서 정리됐을 수 있다. 함정 #6(has_cached_posts 비중)은 미해소. canon 함정 목록은 다음 배치에서 파일별로 재검증 예정 (심층 분석 필요).
심층 분석 필요 (사람이 트리거) — 이 드랍의 규모상 파일별 검증은 오늘 배치 예산을 넘는다. 아래 항목은 개별 세션에서 파야 한다:
simclusters/서브레포 — 코어 알고리즘(SVD? MinHash?), 인덱스 형식,home-mixer가 부르는 API surface, 2020 KDD 논문과의 diffagatha//bdsm//user-cred-v2/— 각 계정 스코어러의 실 모델·업데이트 주기·라벨 임계pnsfwmedia/캘리브레이션 — CLIP 임베딩 + agatha 스코어를 어떻게 결합하는가phoenix/학습 코드 — loss, negative sampling, optimizer, synthetic data 형식phoenix-rankall/·phoenix-rankall-strato/— 인덱싱 파이프라인·visibility 사전 참조 로직abuse-enforcement-service/— 어떤 스코어가 어떤 조치(라벨/챌린지/서스펜션)로 매핑되는가scarecrow/·botmaker/·botmaker-rules/— 규칙 DSL·컴파일러, 공개된 규칙 vs 미공개된 규칙의 비율과 카테고리under-the-hood/— 유저에게 노출되는 라벨 taxonomy와 규칙 코드 링킹home-mixer/나머지 신규 파일 — 새 hydrator·filter·scorer·side-effect (canon 함정 목록 재검증)visibility-filtering/rules/개별 규칙 파일 — 각 규칙의 판정 조건, canon 함정 #2 최종 검증
2. arXiv cs.IR triage — 관찰 1건, 정본 반영 0건
배경 매일 배치 규칙 — arXiv cs.IR 신규 30건을 제목·초록으로 훑고, 프로덕션 저자·A/B 주장·메커니즘 신규성·스케일 결과 중 하나라도 걸리는 것만 원문 확인. 오늘은 30건 중 대부분 RAG/QA/text-to-SQL/멀티모달 벤치마크 등 학술 증분이나 도메인 한정(음악·POI·의료 등). 통과 후보 3건 원문 확인.
새로 알게 된 것
- STAR (2608.12986) — "Structured Tokenization and Target-Aware Interest Representation for PCVR Prediction". 초록에 "KDD Cup 2026 Tencent UniRec Challenge를 위한 프레임워크"로 자기 규정. 프로덕션 배포 진술 없음. 탈락 — 대회 프레임워크는 프로덕션 진술이 아님
- HCGRec (2608.11980) — "Hint-Conditioned Generative Recommendation with Semantic IDs". 저자 소속 미공개(arXiv 페이지에 affiliation 없음), CIKM 2026 accepted 표기, GitHub 링크 있음. 프로덕션 배포 진술 없음. 탈락 — SID 계열 학술 증분
- DrEM (2608.12778) — "Dual-Side Robust Ensemble Ranking from Noisy User Preference Predictions in Video Recommendation". 저자 소속 미공개이나 초록에 *"large-scale online A/B tests"*로 실 배포 주장. 저자 이름(Xiaoxiao Xu, Kaiqiao Zhan 등)이 Kuaishou 계열과 통계적으로 일치할 가능성
[추정]. 관찰 통과 — radar.md의 "이번 달 신규"에 2줄 포인터 추가 (심층 분석 없이). 회사 확정과 프로덕션 지면 확정은 다음 배치에서 크로스체크
정본 반영
- radar.md "이번 달 신규"에 DrEM (video rec, unknown company) 항목 신규. 3~4줄 포인터: A/B 주장 있음·저자 소속 미확인·Kuaishou 라인 가능성
[추정]
의미
레이더의 하루 통과 0~2건 기대치 안. 이번 주는 SID/생성형 랭킹 계열이 계속 증분되고 있으나(Alibaba·Kuaishou·Yandex 라인이 이미 정본에서 관찰 중) 새 회사·새 메커니즘 진술은 아직 없다.
검증에서 뒤집힌 것
- x.md canon의 "가중치 값은 어느 세대에서도 1차 출처가 없다. 유일한 수치 출처는 2023년 4월 5일 시점 스냅샷 하나뿐" — 2026-08-13 뒤집힘.
home-mixer/params/param.rs가 프로덕션 크론 미러로 26개 헤드 가중치·5개 부정 헤드·OON 배수·다양성 상수 전부를 값으로 공개 - x.md canon의 "SimClusters ... 이 이름들은
home-mixer/어디에도 안 나온다" — 2026-08-13 부분 뒤집힘.simclusters/서브레포가 OON retrieval 소스로 홈미서에 배선됨. 단 canon의 "2023 세대에서 살아남은 retrieval은 사실상 tweet-mixer 하나뿐"은 이제 "2023 세대에서 살아남은 retrieval은 tweet-mixer(기본 off로 미러) + SimClusters(부활)" 로 재작성 - x.md canon의 "가중치 값·params 모듈은 레포 밖 — 비공개" 진술을 담은 pipeline 다이어그램(assets/x-pipeline.svg) 갱신 필요 — 완료
- x.md canon의 열린 질문 "VMRanker/DPP가 켜져 있는가" — 켜져 있음이 param으로 확인, DPP θ=0.65 K=150. 열린 질문에서 제거
- x.md canon의 "필터 17개(스코어링 전 14 + 후 3)" — 20개(스코어링 전 17 + 후 3)로 갱신
- x.md canon의 "2026 코드에 [신규 아이템 콜드스타트] 아무 장치가 없다" — 뒤집힘.
PostUnexploredWeight = 0.02+ColdStartImpressionThreshold = 1000+NewUserMinEngagementFilter(신규 유저용) 각각 존재. canon의 "부재" 관찰이 3개월 전 스냅샷 기준이었을 뿐
레이더
- radar.md "이번 달 신규"에 DrEM (2608.12778) 관찰 항목 신규 추가 — video rec A/B 주장, 소속 미확인
다음에 볼 것
- X 4세대 드랍 심층 분석 — 위 심층 분석 필요 10개 항목 중 우선순위: (1)
home-mixer/신규 파일로 canon 함정 목록 재검증 (2)simclusters/서브레포로 canon SimClusters "부활" 진술 확정 (3)abuse-enforcement-service/+visibility-filtering/rules/개별 규칙으로 안전 파이프라인 재구성 - DrEM 저자 소속 확정 — Kuaishou 계열이면 이미 정본 관찰 중인 회사, 다른 곳이면 radar 신규 스레드 후보
- BIDIRECTIONAL_BOOST_CHANGE 이후 X 커밋 추적 — 다음 param diff가 언제 어떤 형태로 올지 — 저장소 매일 배치가 X 커밋을 이미 체크하므로 자동 감지 예정
- EU DSA 투명성 보고서에 X가 이번 8-13 공개 뒤 무엇을 새로 제출/삭제하는지 — 규제 문서와 코드의 sync 여부가 새로운 검증 각도