- Sources read: 1
- Canon files updated: 2
- Radar entries: 0
1Filter that cuts candidates by the same ratio per source is turned on — X
Source xai-org/x-algorithm@989fb91 — xAI public repository, commit of 2026-10-22 06:49 UTC, code. In these notes' numbering, this is Gen4+47. Gen4+N is the number these notes assign in sequence to X commits after the Gen4 release (2026-08-13). The cron mirror (a file that syncs production feature-switch defaults daily and publishes them) has a sync time of 2026-10-21T16:00:32Z. The commit changed 80 files, +3,436/−1,462 lines, and more than half of them are cleanup of the hydration layer in visibility-filtering.
Background X For You sends candidates gathered from several sources to Phoenix (a Grok-based ranking Transformer) for scores, and a request can score at most 2800 candidates. The previous day's commit (Gen4+46) added a filter, off by default, that cuts the same ratio from each served type (the source path a candidate came in through) when candidates exceed this budget. Before that, only the first 2800 of the concatenated candidate list were sent, so sources appended at the end of the list could be cut entirely. This commit turns this filter's switch on in the cron mirror and adds a soft NSFW filter for new users and safety rules for reaction posts.
What we learnedA. The same-ratio-per-source filter is on by default from this commit's cron mirror
The mirror default of
EnableFairShareRankingchanged from false to true verified —home-mixer/params/param.rs:1206-1211.param!( EnableFairShareRanking, bool, "rust_home_mixer_enable_fair_share_ranking", true );The filter's position is unchanged: the very end of the pre-scoring filter list verified —
phoenix_candidate_pipeline.rs:443.So for requests over the budget, each source is now cut by the same ratio instead of all sources at the back of the list being cut inferred. The evidence is that the filter's budget equals the 2800 cap at which the Phoenix request truncates, and that a test pins the same ratio per source (daily 2026-10-22).
The mirror value is only the production default, and per-experiment-bucket overrides are not in the public code verified — caveat of the x.md weight mirror. So we do not assert that it is on for all traffic.
What we learnedB. A filter that drops soft NSFW OON posts for users under one day old was introduced, off by default
- When on, it removes posts labeled soft NSFW (sexual content that is not explicit) from OON (accounts the viewer does not follow) in For You for viewers whose account age is under one day verified —
filters/new_user_soft_nsfw_filter.rs.- The switch
EnableNewUserSoftNsfwFilteris false, and the account age capNewUserSoftNsfwFilterMaxAccountAgeSecsis 86400 —params/param.rs:804-815. - Account age is computed from the creation time embedded in the user ID (snowflake). It does not apply to topic requests, Following, or score-only requests.
- In the list, it was placed right after
CoreDataHydrationFilter—phoenix_candidate_pipeline.rs:416.
- The switch
- The label comes from a new hydrator, which fetches it from the safety label service of VF (visibility-filtering, a safety layer that decides per post whether it may be shown) verified —
candidate_hydrators/new_user_soft_nsfw_label_hydrator.rs.- It does not look up followed accounts, the viewer's own posts, or cached candidates that already have a label.
- If the lookup fails or the label is unknown, the post is kept. The tests
lookup_failure_keeps_the_postandfailed_call_keeps_every_postpin this fail-open behavior (pass the post when there is no verdict).
- There are now two OON filters for new users: the engagement threshold filter and this one verified. We infer it is a device to avoid showing borderline sexual content as OON recommendations in a new user's first-day feed inferred. The evidence is that it targets only OON and the age cap is one day.
What we learnedC. Reaction posts now inherit the safety label of the original post
- If the original post has an adult content or violence label, a post made in reaction to it is also blurred (hidden behind a warning screen) verified —
visibility-filtering/rules/tweet_rules.rs.- For adult content it checks the
NSFW_HIGH_PRECISIONlabel; for violence, theGORE_AND_VIOLENCE_HIGH_PRECISIONandGORE_AND_VIOLENCE_REPORTED_HEURISTICSlabels. - If both labels are present, the adult blur wins. Even if the reaction post itself has a violence label, the original's adult label applies first.
- For adult content it checks the
- If the original author has a protected account, the reaction post is dropped verified —
PROTECTED_ORIGINAL_AUTHOR_DROPin the same file. - The three rules were added only to
TimelineHomeHydrationamong the SafetyLevels (the rule bundles VF uses per surface) verified —rules/levels.rs.- The golden corpus (a test table pinning the expected verdict per rule) also pins that the same post is allowed in
TimelineHome—rules/golden_corpus/reaction_video.rs.
- The golden corpus (a test table pinning the expected verdict per rule) also pins that the same post is allowed in
- If the original label or author lookup fails, the reaction post is shown as is verified —
rules/rule_spec/laws.rs.
"the default shows the reaction post unblurred, as Tweetypie does on a failed lookup" — visibility-filtering/rules/rule_spec/laws.rs, 2026-10-22 (code comment)
What we learnedD. The video carousel does not appear in requests made by scrolling down
- The carousel is now turned off in BOTTOM cursor requests (requests to get more by scrolling the feed down) verified —
home-mixer/util/video_carousel.rs:11-23.!query.is_bottom_requestwas added to the condition for inserting the carousel and the condition for sorting by immersive score.- The server sets
is_bottom_requestto true when the request cursor type isCursorType::BOTTOM—home-mixer/server.rs:404.
- The switch for the side effect (a stage that only logs without changing the response) that records carousel video positions and scores to Kafka is now on by default verified —
params/param.rs:1162-1167. - The carousel's own switch
EnableVideoCarouselis still false in this commit verified —params/param.rs:1120-1125. So the two changes take effect only in experiment traffic where the carousel is on inferred.
What we learnedOther changes
- In shadow traffic (a path that also sends scoring to experimental Phoenix clusters and keeps the scores only in logs), the opt-in cluster
Experiment18Founow receives 0.5 verified —params/param.rs:97-102. Because the default is namedShadowTrafficDefaultPercent, we take the unit to be percent inferred. - Added a metric that counts, per served type, the share of candidates whose weighted-sum score is negative, and splits out whether the negative comes from the not_interested term verified —
side_effects/scored_stats_side_effect.rs. - Added a metric that counts how many posts from authors the viewer muted or blocked Phoenix retrieval fetches verified —
sources/phoenix_source.rs. - The VF client and the safety label client are now created once in the server and shared by the For You and Following pipelines, and the label lookup batch size went from 50 to 100 verified —
home-mixer/server.rs. - Added a training option to the Phoenix ranker that freezes history tokens in the top K Transformer layers and updates only candidate tokens verified —
phoenix/xrex/models/transformer.py. The default is an empty tuple, so it is off. - Training of the immersive surface two-tower (a retrieval model that embeds user and post separately) gained 4-day, evergreen, and NSFW slice evaluation and per-slice recall@600 verified —
phoenix/xrex/configs/xrecsys_two_tower.py. - grox (Grok-based annotation pipeline) gained a setting to fetch all videos at the highest bitrate, false by default verified —
grox/config/config.py. - The hydration store and policy-pinning tests of visibility-filtering were cleaned up, and in this part the verdict rules did not change apart from C inferred. The evidence is that the diff of the rule definition files is only the three rules in C.
Canon update services/x.md was revised as follows:
- Raised the reference commit in
## Summaryto 989fb91 and changed the pre-scoring filter count to 22. - Added the filter count of 27 and a sentence saying the same-ratio filter is on by default to the intro of
## Re-ranking, diversity, and filters. - In the filter section, added
NewUserSoftNsfwFilterto the list and changed the status ofFairShareRankingFilterto on by default. - Added a soft NSFW filter bullet to the new-users subsection of
## Cold start. - In the carousel bullet of
## Feed surfaces, changed the Kafka log switch to on by default and added the BOTTOM request exclusion. - Added a paragraph on the reaction post rules after the intro of the safety section.
- Raised the checked-at point and the commit table of
## Sourcesto 989fb91, and added a Gen4+47 row to the change log summary table. - Changed the filter box of
assets/x-pipeline.svgto "Filters 22, as of the 2026-10-22 commit".
Why it matters ⚠ Claim changed: The same-ratio-per-source filter that yesterday's note called "off by default" has become on in the mirror default after one day. The candidate mix that Phoenix scores now follows per-source share rather than list order inferred. topics and radar have no sentence about this filter, so there was nothing to fix there as well.
What to check next
- Check whether per-served-type metrics or source caps are adjusted after the same-ratio filter is turned on — the change in per-source share is still inferred.
- Check whether the new-user soft NSFW filter and the video carousel get turned on — both are off by default.
- Confirm the unit of the shadow traffic ratio from the is_sampled implementation in shadow.rs — the percent reading is inferred.
Lookup status
- X: There was 1 new commit (989fb91) in xai-org/x-algorithm. Releases were not checked.
- Meta: The latest post in the engineering.fb.com RSS is dated 2026-10-19 and was already checked. ai.meta.com/blog and transparency.meta.com were not checked this time.
- Netflix: The RSS had 1 new post dated 2026-10-22 (Single-tenant Titus); it is a container isolation infrastructure post, so it was skipped. research.netflix.com/publications was not checked.
- arXiv cs.IR: Parsed 30 items, and submissions of 2026-10-21 were newly included. 0 passed. Generative recommendation long-tail restoration (CAPE) and adaptive recursive sequential recommendation (LoopRec) were rejected because they use only public benchmarks, and SID pretraining for search CTR (FineSID) because it is a search surface, not a feed.
- WebSearch cross-checking was not done this time.