- Sources read: 2
- Canon files updated: 1
- Radar entries: 1
Other changes reviewed today:
- The sort score of the X For You video carousel gained a main ranking score term, but its weight is 0.0, so the order is unchanged.
- Kuaishou reported +3.07% ads revenue over the deployed baseline for the follow-up to its generative ads recommendation system GR4AD.
1Ranker training gained ads aggregate and time inputs — X
Source xai-org/x-algorithm@7fef3ba — xAI, 2026-10-30, code. In these notes' numbering, this is Gen4+Gen53.4+N is the number these notes attached in order to commits after the 2026-08-13 Gen4 release).
Background Phoenix (a Grok-based Transformer ranker that predicts per-action engagement probabilities for each candidate in X For You) reads the user history and the candidate as one sequence. Until now, the tokens of this sequence did not take aggregate values such as "how many minutes ago was this history item" or "how many times was this ad clicked recently" as explicit inputs. The 2026-09-18 commit (Gen4+24) added a path for carrying ads engagement aggregates (EngagementCounts) in the request, but where the model uses those values remained an open question. This commit added training options, off by default, that turn those aggregates and the history elapsed time into embeddings and add them to the ranker input.
What we learnedA. Ads engagement aggregates become bucket embeddings added to the candidate embedding
For each ads candidate, three groups of aggregates are built: the ad itself, the viewer–advertiser pair, and the viewer overall verified —
xai-recsys/src/util.rs:177-214.- Each group counts 7 actions over 8 time windows (from 1 hour to 28 days), so 3 × 7 × 8 = 168 features are attached to one candidate.
- Counts are converted to log2 buckets (the binary digit length of the count, 33 slots from 0 to 32).
pub const COUNTERS: [i32; 7] = [1, 2, 14, 3, 4, 5, 8]; pub const WINDOWS_SECS: [u32; 8] = [ 3_600, 10_800, 43_200, 86_400, 259_200, 604_800, 1_209_600, 2_419_200, ]; pub const NUM_BUCKETS: usize = 33; pub fn bucket(count: u32) -> u8 { (u32::BITS - count.leading_zeros()) as u8 }The training model looks up a small embedding for each bucket, concatenates them, and adds them to the candidate embedding after a linear projection to its width verified —
recsys_model.py:3674-3695.- The switch to turn it on is
ads_counts_emb_dim(default 0), and the data-sideread_ads_engagement_counts(default False) must also be turned on — same file:1245. - The projection matrix is initialized to zero. So right after the option is turned on, the model output is the same as when it is off.
- The data loader rejects this option for candidate sequences that mix in negative samples.
- The switch to turn it on is
A function that fills the same buckets was also added on the serving side, but nothing in this commit diff calls it, so we cannot tell whether serving already uses it inferred —
util.rs:547.- The serving model config also gained an
ads_count_featuresfield, whose default is false.
- The serving model config also gained an
What we learnedB. History elapsed time and session activity enter as time inputs
- For each history item, "how many seconds before the request time" is log-compressed, sine and cosine components are attached, and the result is added to the history embedding verified —
recsys_model.py:3697-3722.- The formula is
x = log1p(dt) / 15, and it uses 8 Fourier frequencies (RECENCY_FOURIER = 8) — same file:176-186. - The request time is taken as the maximum of the candidate impression times.
- The formula is
- A session summary is added to the candidate embedding verified — same file:3724-3753.
- It includes the time elapsed since the last activity, and since the last external link open and the last long link dwell.
- It also includes the log-compressed number of history items in the last 5 minutes, 1 hour, and 1 day.
- The switch to turn it on is
wallclock_recency(default False). It cannot be turned on together with the existing feature prep path verified — same file:1217-1223.
What we learnedC. The video carousel score gained a main ranking score term, but its weight is 0.0
- The sort score of the For You vertical video carousel (a module that bundles 3–5 vertical videos into the 6th slot of the feed, off by default) gained the main ranking weighted-sum score as a fourth term verified —
util/video_carousel.rs:28-65.- The default of the new weight
VideoCarouselWeightedScoreWeightis 0.0 —params/param.rs:1263-1268. - When scores are equal, the video with the higher probability of being opened (
video_open) goes first.
- The default of the new weight
- The number of extra candidates for the carousel, 30, changed from a constant to an adjustable parameter, and the value is still 30 verified —
params/param.rs:1281-1286. - Model scores for the immersive surface (the immersive video viewer) are now computed even for requests that reuse cached posts, and candidates that already have a score are not queried again verified —
scorers/immersive_video_scorer.rs:28-63.
What we learnedOther changes
- The action react_with_video, introduced in the 2026-10-13 commit (Gen4+40), was renamed post_video, and its weight stays 0.0 verified —
params/param.rs:471-476.- Proto action 44 became
SERVER_TWEET_POST_VIDEO, and this score was added to the re-ranking log and the shadow traffic log.
- Proto action 44 became
- The dwell time regression head excludes ground truth below 0 seconds or above 1 day from the loss and metrics, and records the number excluded as a metric verified —
recsys_model.py. - The embedding table optimizer (rowwise Adagrad) gained options, off by default, for a weight decay exemption window for recently updated rows and bf16 stochastic rounding verified —
optimizers/recsys/rowwise_adagrad.py. - The ads proto gained info messages for interest category, language, gender, and OS targeting verified —
recsys.proto. - The notification verdict of VF (visibility-filtering, a layer that decides per post whether it may be shown to this viewer) now receives per-post verdicts for mention, reply, and media-tag posts in addition to the account-level verdict verified —
visibility-filtering/filter_notifications.rs. - The abuse-enforcement service gained suspension policy categories (platform manipulation, CSE) and changes to rollback and backfill paths. It is unrelated to feed ranking verified —
types/src/action_control.rs. - Several daily batch jobs of UTH (Under the Hood, a transparency tool where users look up the impression-influence labels attached to their account) were modified. We did not read the contents verified —
under-the-hood/scalding/.
Canon update services/x.md raised the reference commit in ## Summary to 7fef3ba. Added two auxiliary-input sentences to the introduction of ### Ranker input features and SID reconstruction and added an evidence paragraph. Added a sub-bullet for the weighted-sum score term to the carousel item in ## Feed surfaces, and fixed the react_with_video row in the weight table to post_video. Attached an answer bullet under the EngagementCounts consumption-point question in the Gen4+24 undisclosed list, and added one row each to the source sha table and the change log summary table.
Why it matters The training code answered the question open since 2026-09-18, "where does the model use the ads engagement aggregates": it adds them to the candidate token embedding. However, both the training and serving switches are off by default and the serving call site is not visible in the diff, so whether the production ranker was trained with this input remains an inference. The time inputs separately count the time elapsed since external-exit actions such as link opens, so this appears to be an experiment to bring session context into ranking inferred.
2A follow-up to generative ads recommendation raised revenue further — Kuaishou (radar)
Source Towards Reliable, Scalable, and Value-Aligned Generative Recommendation for Large-Scale Advertising — Kuaishou, 2026-10-28 v1, paper.
Background Generative recommendation represents an item as a SID (semantic ID, a code sequence built so that semantically similar items share leading positions), and the model generates that code one position at a time to pick candidates. Kuaishou has already deployed GR4AD, an ads recommendation system using this approach, and writes that in operation it ran into a problem sensitive to SID boundaries and a problem where beam search prunes high-revenue candidates early. This paper reports that its follow-up, GR4AD-X, fixed three things and raised revenue further.
What we learnedA. Cumulative ads revenue rose 3.07% over the deployed baseline
- It writes that a large-scale A/B test on the Kuaishou ads platform achieved cumulative revenue +3.07% over the deployed GR4AD within latency and throughput constraints verified — arXiv abstract.
- Multiple SID paths are assigned to one item to reduce boundary sensitivity.
- Capacity is expanded along several axes instead of widening or deepening the backbone.
- Prefix-level rewards, value-based beam pruning, and discriminative re-ranking are combined in one model.
"Large-scale online A/B tests on the Kuaishou advertising platform demonstrate that GR4AD-X achieves a cumulative revenue improvement of 3.07% over the deployed GR4AD baseline while satisfying strict latency and throughput constraints." — GR4AD-X (paper), 2026-10-28
Canon update Not folded into the canon. Added one additional-evidence line and a detail bullet to the ### Generative retrieval / semantic ID thread in radar.md.
Why it matters Another follow-up report has appeared from a company that deployed SID generative recommendation and fixed problems that surfaced in operation. It follows the same trend as the Alibaba paper of 2026-10-21 (the SID reassignment problem). We did not read the body, and the evidence is the abstract only.
Radar
- Kuaishou GR4AD-X — additional evidence for the SID thread (radar.md).
- Triaged 30 arXiv cs.IR papers. Taobao UGR, e-commerce ads PFA, and food delivery ads PALATE claim production A/B tests, but we left them out because they are incremental work limited to their domains.
What to check next
- Meta Q3 2026 earnings call transcript — a search result summary says Instagram Reels changed to a model that "ranks multiple reels at once in sequence" and that Facebook Reels ranking doubled the history it looks at. We could not open the original transcript in this session, so we did not fold it into the canon. If confirmed from the original text, it would go into the ranking sections of instagram.md and facebook.md.
- Whether X serving calls the ads aggregate bucket function — if a call site appears in the next commit, the inferred can be lifted.
Lookup failed: ai.meta.com/blog — the list only shows posts up to 2026-07, so we could not confirm recent posts Lookup failed: research.netflix.com/publications — could not read the post list from the list page Lookup failed: Meta Q3 2026 earnings call transcript — could not access the original host