- Sources read: 1
- Canon files updated: 1
- Radar entries: 0
1Two safety and dedup rules for the video carousel are now on by default — X
Source xai-org/x-algorithm@f06f45a — xAI, 2026-11-11, code. In these notes' numbering, this is Gen4+Gen61.4 release 2026-08-13: the number these notes gave, in sequence, to xai-org/x-algorithm commits after it).
Background X For You (the algorithmic recommendation feed) has had a carousel, off by default since 2026-10-08, that bundles 3–5 vertical videos into the sixth slot of the feed. Later commits have defined, one rule at a time, which videos must not go in before the carousel is turned on, and have set the defaults. Excluding HighRisk brand safety (a rating that judges whether content is something advertisers do not want beside their ads) has been on by default since 10-31, while MediumRisk exclusion and the 3-day watch exclusion existed only as off by default. This commit turns both rules on by default and adds three new mechanisms to the carousel and the Home feed, all off by default.
What we learnedA. Carousel candidate rules now have HighRisk exclusion, MediumRisk exclusion and 3-day watch exclusion all on by default
- The default of the switch that removes posts with a brand safety MediumRisk verdict from carousel candidates changed from false to true verified —
params/param.rs:1354-1359.- The switch is named
rust_home_mixer_enable_video_carousel_medium_risk_filterand was introduced as off by default in the 2026-11-03 commit (Gen4+55). - The filter code removes a post with no verdict if either the HighRisk exclusion or the MediumRisk exclusion is on. So the handling of posts with no verdict is the same as before.
- The switch is named
- The filter that does not re-insert videos seen through the carousel in the last 3 days is also on by default verified —
params/param.rs:1360-1365.- The switch is named
rust_home_mixer_enable_video_carousel_seen_filterand was introduced as off by default in the 2026-11-06 commit (Gen4+58). The seen record is read from a per-user Redis.
- The switch is named
- The switch that turns on the carousel itself is still off by default in this commit verified —
params/param.rs:1282-1287.
What we learnedB. A path for the carousel to take videos from lower in the main feed is introduced, off by default
With the switch on, the carousel candidate pool starts from main feed posts below the carousel slot, and videos picked for the carousel are removed from the main feed verified —
filters/video_carousel_filter.rs.- Until now the candidate pool was posts beyond the main feed result size (
RESULT_SIZE) plus carousel-only extra candidates. When the switch is on, the starting point becomesVideoCarouselPosition − 1(default 5). - When removing from the main feed, a post counts as the same video if any one of the tweet ID, the video media ID or the MD5 hash matches the carousel video —
util/video_carousel.rs. - The switch is named
rust_home_mixer_enable_video_carousel_take_from_feedand defaults to false —params/param.rs:1366-1371.
- Until now the candidate pool was posts beyond the main feed result size (
The test pins that the 11th video in the main feed moves to the carousel and that the 21st post, which uses the same media, is also removed from the main feed verified — same file.
assert_eq!(ids(query.video_carousel.get().unwrap()), [11, 101, 102, 103, 104]); assert_eq!(kept[..5], [1, 2, 3, 4, 5]); assert!(!kept.contains(&11) && !kept.contains(&21));
What we learnedC. A path that puts a Grok suggested-tasks card in the third slot of the For You Home is introduced, off by default
- A Grok suggested-tasks card was added to the frame list (frames are non-post cards inserted between feed items, such as sports cards), and its slot is third in the Home feed verified —
frames/catalog.rs.- The path is
/grokbot/suggested_tasks; until now frames existed only on soccer, NFL and MLB topic timelines. - The card appears only in the first response, not in new-post check requests (polling) or in requests that scroll down for more. The user cannot dismiss it.
- It does not appear in Topic requests or in the Following feed.
- The path is
- After the card has been shown once, it reappears only after the fatigue time (default 6 hours) has passed verified —
params/param.rs:1256-1267.- The switches are
rust_home_mixer_jetfuel_frame_grokbot_suggested_tasks_enabled(default false) and..._fatigue_hours(default 6). - The card content is received directly by viewer ID from a Jetfuel client (Jetfuel is an internal service that returns the rendered content of frame cards), not from Strato —
sources/jetfuel_direct_frame_source.rs.
- The switches are
What we learnedD. A path that sends the viewer's recently viewed posts and candidate topics to VMRanker is introduced, off by default
- When on, up to 64 posts the viewer recently viewed are chosen in order of impression time and attached, together with topics, to the VMRanker (slate reordering service) request verified —
query_hydrators/recent_views_query_hydrator.rs.- For each viewed post it sends the impression time, surface, action type bits and dwell time (ms). The history is received as an aggregation type that includes recent impressions (
DENSE_WITH_RECENT_IMPRESSIONS), up to 256 rows. - It does not run for Following requests or Topic requests.
- For each viewed post it sends the impression time, surface, action type bits and dwell time (ms). The history is received as an aggregation type that includes recent impressions (
- On the candidate side, the topics of up to 200 top candidates by local weighted-sum score are looked up within 80ms and attached to each candidate verified —
scorers/vm_ranker.rs.- The switch is
rust_home_mixer_vm_ranker_send_post_topics(default false), and the caps arePostTopicsMaxCandidates = 200,PostTopicsTimeoutMs = 80andRecentViewsRows = 64—params/param.rs:385-414. - If the lookup times out, the request is sent without topics.
- The switch is
- How VMRanker uses these values is again not in the public code verified. We infer this is preparation for testing a diversity objective that compares the "just viewed" topics with candidate topics inferred. The basis is that it uses the same experiment payload path as the history topic sending in the 10-20 commit.
What we learnedOther changes
- The safety label cache, which after filling re-read the repository twice at 30 and 90 seconds, now reads it once at 60 seconds, and a metric counts whether the re-read result changed verified —
safety-label-source/dragonfly.rs.- The default retention time for a no-label result (
not_found_ttl) increased from 10 minutes to 1 hour.
- The default retention time for a no-label result (
- A post label action was added to the action settings of abuse-enforcement-service (a service that takes account and post actions based on model scores), and the selectable labels are NsfwHighPrecision and SoftNsfw verified —
types/src/action_control.rs. - Experiment20Fou was removed from the shadow traffic targets (a path that sends only scoring to an experimental Phoenix cluster and is not used for serving), and Experiment24~28Fou were added at a 0.3 ratio each verified —
params/param.rs:91-106. - The TwHIN post and video embedding streaming job first filters for only like and video quality view (VQV) events, then writes to two paths. The action types each path receives are unchanged, so the result is the same verified —
TwhinTweetJob.scala. - Several filters were changed to use the same split helper, and topic annotation decoding was moved to a shared util. There is no policy change verified — commit diff.
- Two unused history aggregation types (33, 35) were changed to reserved numbers in the proto, and a few help-link constants in the VF client were deleted verified — same diff.
- The last sync time of the parameter mirror is 2026-11-10T16:00:31Z verified —
params/param.rs:1.
Canon update services/x.md The reference commit in ## Summary was raised to f06f45a (Gen4+61). A sentence saying the two carousel rules are on by default was added to the ## Feed surfaces introduction. The 3-day watch filter bullet in the carousel item was changed to on by default, and a bullet on taking videos from the main feed and a bullet on the Grok suggested-tasks card were added. The carousel MediumRisk bullet in the "Final placement" section was changed to on by default. A sub-bullet on recently viewed post topics was added under the VMRanker history topic bullet in the diversity section. A bullet on the label cache re-read and a bullet on the abuse-enforcement-service post label action were added to the safety section. A row for f06f45a was added to the table of lookup points in time and reference SHAs in ## Sources, and a row for Gen4+61 was added to the change log summary table.
Why it matters The carousel is still off by default, but the safety and watch rules that will apply once it is on are now all on by default. The basis is that the HighRisk (10-31), MediumRisk and 3-day watch (this commit) exclusions became defaults in turn. We take the new path that takes videos from the main feed to come from a judgment that the carousel candidate pool is short, but the code gives no reason, so we leave it as an inference inferred.
What to check next
- Whether the carousel itself (
EnableVideoCarousel) becomes on by default — the defaults of nearly all carousel rules are now settled, so the next step may be turning it on inferred. - Where VMRanker uses the recently viewed post topics — the public code has no usage, so look at it together with the VMRanker history topic question in the x.md open questions.
- Read Meta Engineering's post on compute allocation for ads delivery, Intelligent Delivery (2026-11-11, blog post). It covers only compute allocation per ads request and not organic feed ranking, so it was not folded into the canon. Whether the idea of setting the number of candidates per ads ranking stage for each request fits topics is for a person to decide.
- Of 30 arXiv cs.IR responses, 14 submitted on 2026-11-10 were newly seen and 0 passed. A paper that predicts the results of recommendation model A/B experiments in advance with a scaling law (arXiv 2611.13539) was rejected because its abstract has no affiliation or production results.
- r/RedditEng, Netflix Tech Blog, the redditinc.com newsroom and the SEC filing list had no new recommendation-related sources. Reddit announced it will end RSS support on 2026-11-13, so tomorrow's lookup approach may change.
Lookup failed: ai.meta.com/blog — the list only shows posts up to 2026-07, so we could not confirm recent posts