0x00 한

Research / Daily reports

  • Sources read: 2
  • Canon files updated: 2
  • Radar entries: 0
In one lineX added page-decoder re-ranking and exploration sampling that records probabilities at the end of For You ranking. Both are off by default, so the current order is unchanged.

Other changes reviewed today:

  • After the Brazilian runoff ended, X deleted the Brazil election filter from For You.
  • Meta released the 2026 version of Andromeda ads retrieval and reported a 2.4% increase in Facebook conversions.

1Page-level re-ranking and exploration were added at the end of ranking — X

Source xai-org/x-algorithm@5ed7963 — xAI, 2026-10-28, code. In these notes' numbering, this is Gen4+Gen51.4+N is the number these notes assigned in sequence to commits after the 2026-08-13 Gen4 release).

Background In X For You, Phoenix (a Grok-based ranking Transformer) outputs action probabilities for each candidate, and VMRanker (a service that re-selects the slate with DPP) sets the order. The 2026-10-14 commit released training code for the page decoder (an RL re-ranking model that picks, slot by slot, the posts for one page from a pool of top-scored candidates), but it did not show where home-mixer (the service that handles For You requests) uses the result. To train RL re-ranking offline, the log must also contain the probability with which the serving policy chose each order, that is, the propensity (the probability that the policy that wrote the log chose that action). This commit adds a scorer that consumes the decoder result, an exploration scorer that records the probabilities, and a serving log that stores those probabilities, all off by default.

What we learnedA. Page decoder results take the top of the ranking in the stage after VMRanker

  • Two scorers were added at the end of the scorer chain verified — phoenix_candidate_pipeline.rs:466-472.

    • The order is PhoenixScorer, ImmersiveVideoScorer, vm_ranker, PageDecodeRerankScorer, PageRlExplorationScorer.
  • When decoder re-ranking is on, home-mixer sends the decoding settings and the current ranking weights together in the Phoenix request verified — page_decode_rerank_scorer.rs:22-49.

    • The 13 weights, from favorite through min_video_duration_ms, use the cron mirror values as they are (a parameter file that copies production defaults every day). This answers the question the 2026-10-16 commit left open about "the caller that fills RankingScoreWeights".
    • diversity_weight is sent as None.
  • The picks Phoenix returns are placed at the top in slot order, and the remaining candidates follow in their original score order verified — page_decode_rerank_scorer.rs:80-110.

    • No new score values are created. The existing set of scores is reallocated in descending order, giving higher scores in pick order.
    • If there are no picks, the scores stay as they are and the fail_open metric is incremented.
    • A test fixes that candidates 1, 3, and 5, assigned slots 2, 0, and 1, receive the top scores in the order 3, 5, 1.
    param!(EnablePageDecodeRerank, bool, "rust_home_mixer_enable_page_decode_rerank", false);
    param!(PageDecodePoolN, u32, "rust_home_mixer_page_decode_pool_n", 200);
    param!(PageDecodeSteps, u32, "rust_home_mixer_page_decode_steps", 64);
    param!(PageDecodeTemperature, f64, "rust_home_mixer_page_decode_temperature", 0.0);
    param!(EnablePageRlExploration, bool, "rust_home_mixer_enable_page_rl_exploration", false);
    param!(PageRlExplorationTemperature, f64, "rust_home_mixer_page_rl_exploration_temperature", 0.2);
    param!(PageRlExplorationTopK, usize, "rust_home_mixer_page_rl_exploration_top_k", 64);
    
    • The block above is an abridged copy of params/param.rs:313-365, one line each. The serving slot count in the 2026-10-14 training code was 12, while the default number of steps here is 64.

What we learnedB. The exploration scorer shuffles the order of the top 64 at random and records per-slot probabilities

  • When exploration is on, the top 64 by score are re-ordered with Plackett-Luce sampling (picking one slot at a time without replacement using softmax probabilities, to set the order) over score/temperature verified — page_rl_exploration_scorer.rs:29-110.
    • The default temperature is 0.2, floored at 1e-6. A test checks that when the temperature is close to 0, the original score order comes out unchanged.
    • Candidates outside the top 64 keep their scores and order.
    • Each candidate gets page_rl_exploration_prob, the probability of being picked at that slot.
  • Exploration is not applied to requests where decoder re-ranking is on and a decoder pick exists verified — page_rl_exploration_scorer.rs:129-142.
  • The new serving log writes the scores and per-slot probabilities of the first 64 posts of the feed that was actually served, per request, to Redis in two data centers verified — phoenix_request_cache_side_effect.rs:201-305.
    • The switch EnablePageLogging of this side effect (a stage that only writes logs without changing the response) is false by default, and the default TTL is 3600 seconds.
    • The exploration probability goes into the proto field rewardRerankSlotProb, the decoder sampling probability into pageDecodeSlotProb, and whether the decoder was applied into the new field pageDecoded.
    • Both the For You and Ranked Following pipelines register this side effect.
  • We infer that this probability is the source of the rl_rerank_prob read by the 2026-10-14 training code inferred. The evidence is that the training code reads the same rewardRerankSlotProb field as the logged probability.

What we learnedC. The Brazil election filter was deleted and the target of the new-user NSFW filter was widened

  • The Brazil election filter file and its pipeline registration were deleted verified — README.md #october-26th-2026.
    • This filter removed posts from accounts reported to the Brazilian Electoral Court from For You unless the viewer followed the account. It was deleted after the October 25 runoff.
    • The pre-scoring filters went from 22 to 21.
  • The target of the new-user soft NSFW (non-explicit sexual content) filter, which is off by default, was widened from accounts under 1 day old to accounts under 7 days old verified — params/param.rs:863-879.
    • The account age cap changed from 86400 seconds to 604800 seconds.
    • Instead, users whose scoring sequence length is 100 or more are excluded. A cap of 0 turns this condition off.
  • Eight reported-heuristic label rules were deleted from VF (visibility-filtering, a service that decides per post whether it may be shown to this viewer) verified — rules/tweet_rules.rs.
    • The deleted rules are 6 NSFW_REPORTED_HEURISTICS rules (blur, age-verification tombstone, app-update tombstone, and others) and 2 GORE_AND_VIOLENCE_REPORTED_HEURISTICS rules.
    • Posts that carry only these labels likely no longer get blur or warning-screen treatment in VF inferred. The code does not show whether the labels themselves are no longer generated.

What we learnedOther changes

  • A switch that removes brand-safety HighRisk posts from video carousel candidates was introduced, off by default verified — video_carousel_filter.rs:29-39. When on, posts with no verdict are also removed.
  • The README added announcements for the October 8 improvement to dwell time prediction and the October 13 change that made posts read to the end a retrieval training target verified — README.md.
  • The cluster selection parameters of the Thunder candidate source were deleted verified — sources/thunder_source.rs.
  • A feature that lets multiple processes stop together at the end of offline data was added to the Phoenix trainer, off by default verified — train/follow_data_end.py.
  • The ads conversion action ADS_LEADGEN_CONVERSION = 196 was added to the proto verified — recsys.proto.
  • The motion-reveal video prompt wording and the author metadata field of grox (a Grok-based annotation pipeline), and the user type lookup of abuse-enforcement, changed verified — 5ed7963.

"With the 2026 Brazilian elections over, we have removed Brazil2026ElectionFilter from For You. Posts from the accounts it covered are no longer filtered out because of it." — xai-org/x-algorithm README, 2026-10-28 commit

Canon update In services/x.md, corrected the reference commit and the pre-scoring filter count (22→21) in ## Summary; added the two new scorers in one sentence to the ## Ranking introduction and updated the scorer-chain bullet in the Phoenix section to 5ed7963. Updated the filter count and list in the ## Re-ranking, diversity, and filters introduction and the filter section, and recorded the deletion in the Brazil election filter bullet. Fixed the target condition of the new-user soft NSFW filter in two places, and added the carousel HighRisk switch to the final placement section. Added rows for the page decoder and Plackett-Luce sampling to the ## Glossary table, and wrote the answers as bullets under open questions 1 and 2 of the 2026-10-14 commit; added rows to the reference commit in ## Sources and the change log summary table, and corrected the filter count and re-ranking stage in assets/x-pipeline.svg.

Why it matters X released the last link needed to put page-level RL re-ranking into serving. The loop is now in place in code: exploration records probabilities, those logs train the decoder, and the decoder result is placed at the top. However, all three switches are off by default, so there is not yet evidence that this is applied to the actual feed.

2Andromeda now scores all eligible ads on the GPU — Facebook

Background Andromeda is Meta's ads retrieval engine that narrows Facebook and Instagram ad candidates within a few milliseconds. The 2024 post described organizing ads into a trained hierarchical index that outperformed two-tower and ANN (approximate nearest neighbor search). Because of cost, retrieval usually uses a simpler model than ranking, so the balance between accuracy and throughput has always been a problem. This post describes the model structure and GPU co-design of the 2026 version of Andromeda.

What we learnedA. The retrieval model became an MoE and scores all eligible ads on one GPU

  • The retrieval model changed to Mixture-of-Experts (a structure that routes each input to a subset of expert networks for computation) verified — Meta blog post.
    • On the user side, a single tower became an ensemble of several specialized user towers.
    • The ad tower also encodes the real-time serving context.
    • The interaction layer changed from a dense network to a gating network based on MoE attention.
  • The blog post says this model reaches near ranking-level performance at about 1/300 of the inference FLOPs of the 2024 model verified — same blog post.
  • It puts targeting rule application (index matching), scoring, and top-K selection on the same GPU and scores every eligible ad in the candidate pool verified — same blog post.
    • The hardware is NVIDIA GH200, and one server processes more than 1 billion ads per second. The post says network traffic fell about 100×.
    • In this post, index matching is the stage that applies advertiser-defined targeting conditions across dozens of feature categories.
  • The 2024 hierarchical index is mentioned only as a starting point, and its role in the new pipeline is not described verified — same blog post.

What we learnedB. The online result is a 2.4% increase in Facebook conversions since 2025

  • The only online result the blog post reports is a 2.4% increase in Facebook conversions verified — same blog post.
  • Whether this figure is an effect of the 2026 version alone or a cumulative effect since 2025 cannot be determined inferred. The evidence is the period phrase "Since 2025".
  • This post also does not state that the same stack is used for organic feed retrieval verified — same blog post.

"model performance approaches ranking-level in a typical retrieval-then-ranking system, at approximately 300x fewer inference-time FLOPs than the 2024 Meta Andromeda retrieval model."

"Since 2025, Meta Andromeda has delivered a 2.4% increase in conversions on Facebook." — Meta Andromeda (blog), 2026-10-28

Canon update In topics/embedding-retrieval.md ## Layer 4 — Andromeda + HILL/MoNN: train the index, added the 2026 version's MoE structure, scoring of every ad, and performance figures as one paragraph and bullets, and added this post to ## Sources.

Why it matters The direction of Meta ads retrieval has moved from looking at fewer candidates through an index to looking at all of them with hardware. The evidence is the phrase "scoring every eligible ad" and wording that refers to the hierarchical index only as past groundwork. However, no sentence says the hierarchical index was dropped, so this does not overturn the earlier claim.

What to check next