- Sources read: 4
- Canon files updated: 2
- Radar entries: 1
Other changes reviewed today:
- In the same commit, X added a dwell-based head to the candidate retrieval model.
- Meta announced that it switched the backbone of its ads foundation model GEM from InterFormer to Kunlun and merged the per-surface models into one.
- Meta described a serving approach that uses spare inference GPU capacity to evaluate more ad candidates or route requests to a larger model.
1Video open weight went down and like and dwell weights went up in the home-mixer mirror — X
Source xai-org/x-algorithm@e1a0375 — xAI public repository, commit of 2026-10-13 08:05 UTC, code. These notes number X commits sequentially after the Gen4 release, and this commit is Gen4+40. It changed 179 files, with +26,532/−5,971 lines. It came four days after the 2026-10-09 commit (Gen4+39), so the change volume is large. More than half is a refactor of the account enforcement service and visibility-filtering (VF, impression policy filter); this section covers only the parts related to feed behavior.
Background X publishes the For You feed code by syncing it to a public repository, almost one commit per day. home-mixer/params/param.rs in the repository xai-org/x-algorithm is a mirror in which production defaults are copied over by cron. The ranking score is the sum of the action probabilities predicted by Phoenix (a Grok-based Transformer ranker), such as like, reply and video open, each multiplied by this mirror's weights; this computation is called the value model. This commit changes three of these weights, adds a dwell-based head to candidate retrieval, and releases a new reply ranker for the conversation view.
What we learnedA. In the home-mixer mirror, the like and dwell time weights went up and the video open weight went down
- Of the three changed weights, the like and dwell time weights went up and the video open weight went down verified —
home-mixer/params/param.rs:320, 341-346, 401-406.The like weight
FavoriteWeightwent up from 0.5 to 0.6.param!(FavoriteWeight, f64, "rust_home_mixer_favorite_weight", 0.6);—
home-mixer/params/param.rs:320(code), 2026-10-13The video open weight
VideoOpenWeightwent down from 0.07 to 0.02.The dwell time weight
ContDwellTimeWeightwent up from 0.004 to 0.006.The mirror sync time is
2026-10-12T16:00:33Z.
- The VM-Ranker mirror uses the same feature switch keys, and the three values are unchanged at 0.5, 0.07 and 0.004 verified —
vm-ranker/params.rs:3, 12-17, 54-59.- VM-Ranker is a separate service that receives the score home-mixer computed first and recomputes the value model and the DPP (determinantal point process) diversity re-ranking.
- The two mirrors diverged for the second time, after the new-author boost (
PostUnexploredWeight) in the Gen4+37 commit. So again we cannot confirm which side holds the actual serving value inferred.- For requests that VM-Ranker answers, the VM-Ranker value may be the final one.
What we learnedB. A dwell-based head was added to candidate retrieval, widening the objective from likes to dwell
Two-tower retrieval builds a vector for each user and each post, and fetches the posts with the largest dot products as candidates. Which actions are trained as positives (correct answers) becomes the retrieval objective function.
The combined preset that trains home and immersive together went from 2 candidate heads to 3 verified —
phoenix/xrex/configs/xrecsys_two_tower.py:251-300.The three heads are named
home,immersiveandld.The
ldhead has a single positive action,CLIENT_TWEET_RECAP_DWELLED."ld_positive_actions": [recsys_pb2.ActionName.CLIENT_TWEET_RECAP_DWELLED], "num_candidate_heads": 3, "head_names": ["home", "immersive", "ld"], "w_ld": 0.75,—
xrecsys_two_tower.py:293-296(code), 2026-10-13
The serving score is a weighted sum of the dot products of the
homeslot and theldslot verified —recsys_two_tower_model.py:93-120, 1916-1920, 2385-2412.- The formula is "home slot dot product × 1.0 + ld slot dot product × 0.75".
- Both slots sit side by side in one row of the post embedding table, and the same user vector scores each slot before the weighted sum.
With this change, the objective of home retrieval widened from "posts to like" to "posts to like or dwell on" verified (config values).
- Until now, the home head had a single positive, like (
SERVER_TWEET_FAV).
- Until now, the home head had a single positive, like (
We infer that the head name
ldis short for long dwell inferred. The evidence is that the positive is namedRECAP_DWELLEDand that "Recap" was Twitter's internal name for the ranked home timeline.- How many seconds count as "dwelled" is not in the public code.
In the same preset, the user installed-apps feature (
enable_user_installed_apps) was turned off verified (line 259).
What we learnedC. A reply ranker for the conversation view was newly released
- A model that scores up to 64 replies to a single post per user was newly released verified —
xrecsys_reply_two_tower_v2.py.- The model name is
reply_two_tower_v2. - The model code is
recsys_reply_two_tower_v2_model.py(1,077 lines). - The serving registration file calls this model "reply-ranker".
- The model name is
- The model is much smaller than the home ranker verified. It has 1 Transformer layer, 256-dimensional embeddings and 127 history entries.
- Unlike home Phoenix, it has many hand-engineered features verified —
phoenix/crates/common/xai-recsys/src/reply.rs.- Engagement counts of the reply
- Author follower count and verification status
- Whether the original post's author liked or replied to it
- Cumulative report, block and mute counts
- Reply score assigned by Grok (
grox_score)
- The code that calls this ranker is not public verified. None of the 17 changed home-mixer files contains a call.
What we learnedOther changes
- For video-exclusion requests, candidates whose quoted original post is a video or whose conversation ancestor post contains a video are also filtered out verified — new
filters/ancestor_video_filter.rs. - The video carousel gained options for author dedup and SID (semantic item ID) prefix dedup, and both are off by default verified —
home-mixer/util/video_carousel.rs.- The video carousel is the vertical video bundle in the 6th slot of For You, and it is off by default.
- One new term was added to the value model, with a default weight of 0.0 verified —
xai-value-model/scoring.rs:136.- The term is named
react_with_video. - The action
SERVER_TWEET_REACT_WITH_VIDEOtook proto ActionName slot 44, whichCLIENT_CARD_CLICKhad occupied.
- The term is named
- A retrieval dataset
ZERO_FAV(No. 16), which appears to collect posts with 0 likes, and its statistics logging were added verified. No code fills the channel, so any interpretation beyond the name is inferred. - home-mixer fills in feed request context (
FeedRequestContext) values for the first time. However, the place that fills them is the ads index request, not the Phoenix ranking request verified —sources/ads_source.rs.- These values were added to the Phoenix request in the 2026-10-09 commit (Gen4+39).
- abuse-enforcement-service gained a new file that changes per-rule enforcement actions at runtime and a new file that turns off enforcement entirely verified. We infer it has no direct relation to feed ranking inferred. A deep dive is needed.
- The two files are
action_control.rs(3,218 lines) andoff_switch.rs(1,619 lines).
- The two files are
Canon update Created a new "Gen4+40" section in services/x.md and summarized A–E. In the weight table of the ranking section, the favorite, video_open and cont_dwell_time rows list both mirror values, and a react_with_video row was added. In the open questions section, four deep-dive items were added and the FeedRequestContext item was revised to partially resolved. In the sources section, e1a0375 was added as the reference commit.
Why it matters
- The weight mirror values changed for the first time since the Gen4+37 commit, where the two mirrors diverged on the new-author boost, and the direction is "reduce the share of video opens and increase the share of likes and dwell" verified (values). However, the VM-Ranker mirror is unchanged, so the actual serving value cannot be confirmed inferred.
- Putting dwell into the objective all the way down to retrieval is new verified. Together with the Gen4+31 commit that raised the post-click dwell weight from 0 to 0.4 and the Gen4+38 commit that changed the loss to CREAD (classification per threshold, then restoration), X appears to be increasing the share of dwell signals from retrieval through ranking inferred.
- The reply ranker is evidence that the README's claim that "all hand-engineered features were removed" applies only to the home feed verified (feature list).
2GEM 2026 moved to Kunlun and merged per-surface models — Facebook·Instagram (ads)
Source Meta's Generative Ads Model (GEM): Scaling the Central Model and Compute Engine for Frontier Ads AI — Engineering at Meta, 2026-10-13, blog post (no author listed). As supporting material, we also read the abstract of Kunlun: Establishing Scaling Laws for Massive-Scale Recommendation Systems through Unified Architecture Design — arXiv, 2026-02-10 (v3 2026-06-05), paper.
Background GEM (Generative Ads Model) is a large foundation model that Meta uses for Facebook and Instagram ads recommendation. It does not serve ads directly; it acts as a "teacher" that transfers knowledge to the small per-surface models (vertical models) that actually serve. Based on the first release post in 2025-11, these notes summarized GEM as "a unification of Wukong (feature interaction) and InterFormer (alternately learning sequence and cross features)". This post covers what changed in the 2026 generation of GEM.
What we learned
The backbone changed from InterFormer to Kunlun verified. Kunlun came out first in a 2026-02 paper, and its abstract already said: "Kunlun is now deployed in major Meta Ads models".
"Compared to the previous version (Interformer), Kunlun delivers 2x performance gains with the same computation scaling." — GEM 2026 blog post (blog), 2026-10-13
The blog post says CompSkip (a technique that turns off some components during training to skip computation) cut FLOPs by 43% verified.
"By selectively deactivating the specific components, which is based on the assumption that the network can recover quickly after re-activating, we reduce FLOPS by 43% with negligible quality loss." — same post (blog), 2026-10-13
Per-surface models were merged into one verified. It has shared experts and domain-specific experts together, and per-surface training data is mixed virtually rather than merged physically.
"The 2026 generation of GEM shifts from isolated per-domain optimizations — such as Facebook, Instagram, Reels — to a single central foundation model." — same post (blog), 2026-10-13
Long-term engagement history length was increased 2× in production, and the capability to increase it up to 25× was confirmed verified.
Model complexity is 2.5× that of the previous GEM, and the post says it observed LLM-like scaling laws at that scale verified.
Training efficiency (MFU 20-25%, FLOPs 4×) is the same figure as in the 2026-08-03 post verified.
There are three paths for transferring knowledge to downstream models verified.
LoopFM is a post-training technique that passes GEM's internal representations and history memory to downstream models. It claims 2× the transfer effect of ordinary knowledge distillation (training that uses the teacher model's predicted probabilities as the student model's labels).
Soft label distillation is also used.
Solaris precomputes the GEM embeddings of the user-ad pairs that the next request will need.
"It speculatively precomputes foundation model embeddings for the user-ad pairs a future request is likely to need, and delivers them just-in-time on the serving hot path." — same post (blog), 2026-10-13
The post gave improvement figures for conversion and ad click-through rate verified.
"GEM has delivered 18.9% conversion improvement and 12% ad click-through rate (CTR) improvement across Meta's ad surfaces and objectives, and additionally contributed 5.8%, 4.1%, and 1.6% conversion uplift on Facebook, Instagram, and off-site conversion for targeted users over the past year." — same post (blog), 2026-10-13
The first two figures have no period or baseline, and the last three are cumulative over the past year. The A/B design is not in the text.
It disclosed a plan to expand to organic feed data verified (plan statement).
"Looking forward, we are excited to extend GEM to learn from all of Meta's platform data, capturing behavior across organic and ads engagements spanning text, images, and video." — same post (blog), 2026-10-13
Canon update Revised the "Lineage B (ads)" section of topics/sequence-transformer-ranking.md. Added Kunlun (2026-02) and the GEM 2026 generation (2026-10) as rows in the lineage table, and wrote a new "GEM 2026 generation" paragraph summarizing the above. The Meta (ads) entry in the "Who uses it" section and the sources section were also updated.
Why it matters
- ⚠ Claim changed: the canon's "GEM = unification of Wukong and InterFormer" is now a description of the 2025-11 generation, and the backbone of the 2026 generation is Kunlun verified.
- Solaris points in the same direction as the design disclosed by LLaTTE (Meta's ads ranking sequence model), which moves heavy sequence computation out into an asynchronous upstream model inferred. However, the two posts do not cite each other, so we cannot tell whether they are the same system.
- For the observation these notes have tracked, that "the organic (HSTU) lineage and the ads (GEM) lineage do not cite each other", a plan to converge appeared for the first time inferred. It is only a plan statement, not a deployment fact.
3Spare inference capacity adds ad candidates or larger models — Facebook·Instagram (ads)
Source Turning Opportunistic AI Inference Capacity Into Better Ads Recommendations — Engineering at Meta, 2026-10-12, blog post.
Background Inference GPU capacity is provisioned for peak demand, so spare time appears depending on region, time of day and accelerator type. This source is closer to serving infrastructure than to a feed ranking mechanism, so its boundary is ambiguous. This post explains how to turn that spare capacity into ads recommendation quality.
What we learned
- There are two levers for using spare capacity verified.
- Increase the number of ad candidates evaluated in the ranking stage (Rank More Ads).
- Send requests to a larger model (Serve Better Models). Higher-value requests are prioritized first.
- To protect the primary service, it uses physical and logical isolation, latency-based feedback and value-based load shedding (dropping less important requests first under overload) verified.
- It did not disclose effect figures for latency, conversion or revenue verified (the text has no figures).
"Inference fleets must maintain enough capacity to meet demand under strict latency and reliability targets. However, demand and capacity rarely align perfectly across time, regions, resource combinations, and accelerator types." — Turning Opportunistic AI Inference Capacity Into Better Ads Recommendations (blog), 2026-10-12
Canon update Left a one-line note in the last bullet of the "GEM 2026 generation" paragraph of topics/sequence-transformer-ranking.md and in the sources section.
Why it matters In this approach, even the same request can get a different candidate count and model size depending on capacity at that moment inferred. This follows directly from the two levers the post described. It points the same way as MARM's (the serving system for Meta ads models) "per-request routing", but the post did not disclose how the two relate.
Radar
- Added the GEM 2026 generation as additional evidence to the "recommendation model scaling laws" thread (a canon update item). The evidence is the blog post and Kunlun arXiv 2602.10016.
What to check next
- Deep-dive the 2026-10-13 commit (Gen4+40). The serving values of the four weights whose mirrors diverged are still inferred.
- Find the dwell threshold of the two-tower
ldhead. - Find the service that calls the reply ranker.
- Check whether the abuse-enforcement
action_control,off_switchand the VF refactor contain policy changes.
- Find the dwell threshold of the two-tower
- Read the body of the Kunlun paper (arXiv html) and check Event-level Personalization and production metrics — we have not yet confirmed which experiment in the paper corresponds to the blog post's "2x performance gains".
- Look for a primary paper on LoopFM and Solaris — the current evidence is only the blog post's wording.
Source check notes
- X: Since 2026-10-12 there has been 1 commit, on 2026-10-13, and no release.
- The commit is
e1a0375.
- The commit is
- Meta: engineering.fb.com has 4 posts since 2026-10-12.
- Two posts besides the 2 above were skipped as unrelated to feeds. One is "OCP Summit 2026" on network hardware, and the other is "Shipping Media Over QUIC at Meta Scale for Instagram Live Ingest" on live streaming.
- The latest post on ai.meta.com/blog is from 2026-07, so there are no new posts.
- The update stamp on the transparency.meta.com ranking explanation pages is still 2023-12-31.
- WebSearch cross-checking returned only Threads Dear Algo and Your Algo, which are already in the canon.
- Netflix: The latest post in the netflixtechblog.com RSS is from 2026-09-25, so there are no new posts. The latest entry in the research.netflix.com publications archive is 2026-02-24.
- arXiv cs.IR: 30 items were parsed, and 0 passed.
- The near miss is 2610.10920. It is a RecSys 2026 OARS workshop paper that evaluates the placement of recommendation modules on e-commerce search pages offline with an LM; it is limited to the search surface and makes no deployment claim.
- The latest submission date in this response is 2026-10-09, and the 10-12 batch largely overlaps with this list.
- It was a Wednesday, so the industry blog scan was not done.