0x00 한

Research / Daily reports

  • Sources read: 4
  • Canon files updated: 2
  • Radar entries: 2
In one lineX changed the For You home ranker to a model that reads continued video viewing and profile dwell time, and on the same day re-tuned seven ranking weights.

Other changes reviewed today:

  • X added a term to Phoenix that predicts Grok analysis actions, but its weight is 0.0.
  • X's visibility-filtering applies an engagement limit to posts that carry a dynamic product ad label.
  • Alibaba reported that putting high-scored candidates that were never exposed back into recall increased discovery categories in the Taobao feed by 3.5%.

1Home excursion aggregation becomes the default and seven weights change — X

Source xai-org/x-algorithm 021afa4 — X (xAI), 2026-11-05, code. In these notes' numbering, this is Gen4+Gen57.4+N (N is the number these notes assigned in order to commits after the 2026-08-13 Gen4 release).

Background X For You (a recommendation timeline that also mixes in posts from accounts the user does not follow) sorts posts by a weighted sum of per-action probabilities predicted by Phoenix (X's Grok-based ranking Transformer). The defaults of these weights and switches are published through a cron mirror (a file that syncs the production configuration defaults to the repo every day). The 2026-10-06 commit introduced a continuous-value head that predicts home excursion (the time spent after opening a video from the home feed to keep watching it, or after jumping to the author's profile), but left it off by default. This commit reflects the 2026-11-04 sync: it turns on home excursion aggregation and score intake by default and changes seven ranking weights at once.

What we learnedA. The serving home ranker switched to an aggregation that carries home excursion history

  • The default aggregation of the history that home-mixer (the service that receives For You requests) sends to Phoenix changed to the home excursion variant verified — home-mixer/params/param.rs:166-171.
    • PhoenixAggregationType: DENSE_WITH_LONG_DWELL → DENSE_WITH_LONG_DWELL_HOME_EXCURSION.
    • As of the 2026-10-20 commit, this aggregation was used only in the shadow cluster (a path that sends part of real requests to the experiment model as well and only logs its scores) Experiment16Fou.
  • The switch that extracts the two home excursion scores from the Phoenix response is also on by default now verified — same file, lines 307-311.
    • EnableHomeExcursionScores: false → true.
  • Even so, the three home excursion terms in the home-mixer weighted sum are still fixed at 0.0 verified — home-mixer/scorers/value_model.rs:39-41.
    • The extracted scores are passed to VMRanker (the slate re-ranking service) requests and to logs. The effect on ranking comes from the aggregation change, that is, from the model input side inferred. The basis is that home-mixer uses a constant 0.0 as the weight of this term.

What we learnedB. In the same sync, seven weights changed by different factors

  • favorite, share and cont_dwell_time went up, video_open, click and cont_click_dwell_time went down, and the penalty of not_interested grew slightly verified — home-mixer/params/param.rs:399-512.

    • cont_dwell_time is the weight applied to the continuous dwell time value, and cont_click_dwell_time is the weight applied to the continuous value of dwell time after clicking in.
    favorite               0.66    → 0.708   (×1.073)
    video_open             0.02    → 0.0
    click                  0.3     → 0.274   (×0.913)
    share                  2.0     → 2.118   (×1.059)
    cont_dwell_time        0.006   → 0.0075  (×1.25)
    cont_click_dwell_time  0.4     → 0.385   (×0.9625)
    not_interested       −52.272   → −53.07  (×1.015)
    
  • The previous three adjustments were exactly 1.1× each, but this time the factors vary verified (arithmetic). Because they arrived on the day the model input changed, they appear to be a recalibration to the probability distribution of the new model inferred. The only basis is that the two changes came in at the same sync time (2026-11-04T16:00:31Z).

  • With the video_open weight at 0, the probability of opening a video no longer receives a score directly in the home-mixer weighted sum verified. The vm-ranker mirror is still 0.07 verified — vm-ranker/params.rs.

What we learnedC. Posts with a dynamic product ad label have limited engagement

  • visibility-filtering (the stage that decides, post by post, whether a post may be shown to this viewer) gained a dynamic product ad rule verified — visibility-filtering/rules/tweet_rules.rs:1137-1142.
    • The condition is the SafetyLabelType::DYNAMIC_PRODUCT_AD label, the target is all viewers, and the action is LimitedEngagementReason::DynamicProductAd.
    • The rule was added to the rule list at the home timeline hydration level.
  • A separate verdict level for promoted posts in the home timeline was introduced verified — visibility-filtering/rules/levels.rs:371-374.
    • TIMELINE_HOME_PROMOTED_HYDRATION looks only at the block relationship as its viewer-side rule, and for the post side it reuses the home hydration's own rules as they are.

What we learnedOther changes

  • The Following tab ads blender records the reasons it could not insert an ad (too few posts, adjacent-post risk, spacing limit, and so on) verified — home-mixer/ads/following_ad_blender.rs. The placement rules appear to be unchanged inferred. The basis is that the blocking verdict order is the same as before: handle, keyword, low risk.
  • A switch that also uses the ads impression history cache in other data centers was introduced, on by default verified — EnableAdsHistoryXdcCacheWrite, same param.rs lines 941-946.
  • A new cache layer was introduced for safety label lookup, and it is off because the shadow and serving bucket defaults are 0 verified — safety-label-source/dragonfly.rs.
  • VMRanker gained an API that reads carousel model JSON files from a directory and returns them by name verified — vm-ranker/carousel_model.rs. Which model goes in is not public.
  • The action scores of the page RL re-ranker (a model that picks, in slot order, the posts to place on one page) gained DM share and link copy terms with weight 0.0 verified — phoenix/xrex/models/page_rl.py.
  • The spam verdict of grox PTOS (the policy-based violation verdict layer) also counts accounts tagged in media toward the mention count verified — grox/flows/ptos/task_filter.py.
  • The Phoenix retrieval request gained author include and exclude list fields verified. Continuous action slots 6 and 7 for ads were renamed to video watch seconds and video length verified — recsys.proto.

"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 (code comment), 2026-11-05

Canon update In services/x.md, raised the reference commit of ## Summary to 021afa4. Fixed the favorite, video_open, click, share, cont_dwell_time and cont_click_dwell_time cells of the positive table under ### Weights and the not_interested cell of the negative table to the current values and reference, and moved the previous values to a newly created 'this section's change log' list. Fixed the introduction of ### Ranker input features and SID reconstruction and the home excursion paragraph, the dynamic product ad paragraph in ## Ads, the bullet under question 2 of Gen4+45 in ## Open questions, the home excursion row of the ## Glossary table, and the reference commit table in ## Sources, and added one row to the change log summary table.

Why it matters X's home ranker is now a model that reads "how long the user stayed after opening" as a history input. The basis is that the training preset and the serving aggregation changed together, one day apart. Whether the weight re-tuning is tied to this switch cannot be confirmed from the mirror alone, so we leave it as an inference.

↑ Contents

2Home ranker training uses home excursion time as input and head — X

Source xai-org/x-algorithm b508926 — X (xAI), 2026-11-04, code. In these notes' numbering, this is Gen4+56.

Background The home excursion head was designed to be multiplied with a probability head, as in "probability of opening the video × seconds of continued viewing once opened", but until now no loss that trains this head was visible in the public training configuration. This commit turned on that loss and the history input together in the home ranker training preset for H100 GPUs, and created a weight slot of 0.0 for the Grok analysis action.

What we learnedA. The training preset turned on home excursion time as both a history input and a prediction target

  • The home_direct_packed preset adds video continuation seconds and profile dwell seconds to the embedding for each history item verified — phoenix/xrex/models/recsys_feature_prep.py.
    • The values are clipped to 0–300 seconds, normalized with log1p(x)/log1p(300), multiplied by a training vector initialized to 0, and added.
    • The flag is enable_home_excursion_history and it defaults to False. It is True only in this preset.
  • The same preset trains the two continuous heads only on cases where the video was opened and where the profile was tapped verified — phoenix/xrex/configs/xrecsys.py:262-313, 532-549.
    • The loss weight is 0.013 for video continued viewing and 0.0035 for profile dwell. The loss form is CREAD (an approach that trains time as exceedance of multiple thresholds), the same as the existing dwell head.
    • Conditional training is applied through condition_action_index (CLIENT_TWEET_VIDEO_OPEN, CLIENT_TWEET_CLICK_PROFILE) and is computed only on the two home timeline surfaces.

What we learnedB. A weight term for the Grok analysis action was introduced at 0.0

  • A grok_analyze weight was introduced in the shared value model and the two mirrors, with a default of 0.0 verified — home-mixer/params/param.rs:483-488.
    • The weighted sum went from 29 terms to 30 (xai-value-model/scoring.rs).
  • This term appears to be a prediction of the action of analyzing a post with Grok inferred. The basis is the name alone, and the home-mixer Phoenix scorer in the 2026-11-05 commit has no code that fills this score.

What we learnedOther changes

  • The gRPC data loader path for Phoenix training was deleted verified — phoenix/xrex/data/grpc_recsys.py (deleted).
  • Reply two-tower training gained a rust_kafka dataset variant, and two-tower evaluation changed from ld-head-only to a general mixed-head form verified — phoenix/xrex/configs/xrecsys_two_tower_evals.py.
  • The training input TweetInfo gained an author engagement count field verified — recsys.proto field 49 authorEngagementCounts.
  • The visibility-filtering hydration layer was substantially rewritten verified. We did not read whether policy changed.

Canon update In services/x.md, added a home excursion paragraph to ### Ranker input features and SID reconstruction, added a grok_analyze row to the weight table, and added one row to the change log summary table.

Why it matters The home excursion head got only a placeholder on 2026-10-06 and a month later gained a training loss and a history input. However, it is still 0 in the home-mixer weighted sum, so for now it is a signal that changes the model representation, not the ranking.

↑ Contents

3Putting high-scored unexposed candidates back into recall — Alibaba

Source From Waste to Discovery: Recycling High-Scored Unexposed Candidates in Taobao Feed Recommendation — Taobao & Tmall Group of Alibaba, 2026-11-04 v1, paper.

Background Recommendation feeds often push less-exposed content so that users find new interests, but cold items with little information are easily overestimated by the ranker, which tends to cut only engagement. This paper proposes recycling items that the ranker scored highly but that were never exposed because they lost out on slots, instead of discarding them. It reports the results of deploying URED, a channel that collects such items for 30 days and puts them back into the recall (candidate generation) stage, in the Taobao feed.

What we learnedA. Unexposed high-scored candidates increased discovery without cutting engagement

  • In each session, the system collects items from the top 200 by ranking that are in categories the user has not seen recently and that were not exposed verified — HTML version.
    • Up to 1000 items per request go into the unified pool together with other recall channels, and lookup is O(1) per request.
  • In the online A/B test, it gained +3.47% discovery categories, +8.47% content diversity, and +2.62% completed video views verified — same paper.
    • Each experiment ran for more than one week, with 10% of traffic for the control group and 5–10% for the treatment group.
    • Shortening the collection period to one day reduces the discovery effect to +0.55% (not statistically significant), and inserting items at random without a score filter has no effect.

"URED has been deployed in production in the Taobao feed recommendation system for over six months, serving tens of millions of daily active users." — URED (paper), 2026-11-04

Canon update Added an Alibaba URED entry to ## New this month in radar.md.

Why it matters This is a production claim that exploration can be replaced by unexposed candidates the ranker is already confident about, without pushing cold items for exploration. There is no evidence that a tracked service uses the same mechanism, so it goes on the radar.

↑ Contents

Radar

  • Alibaba URED — recalling high-scored unexposed candidates — arXiv 2611.05997.
  • Added Meta Axia to the "Recommendation model scaling laws" thread — arXiv 2611.05643. It is a tool that finds the scaling law of each model with few experiments, and its abstract reports a cumulative online improvement of 0.36% in Meta's ads system.
  • Triaged 30 arXiv cs.IR papers. A local commerce generative retrieval paper was not included because its deployment figures were development-stage measurements.

↑ Contents

What to check next

↑ Contents