- Sources read: 1
- Canon files updated: 1
- Radar entries: 0
1Default name set for the video carousel CTR model — X
Source xai-org/x-algorithm@3b6919f — xAI, 2026-11-07, (code). In the numbering these notes assign, this is Gen4+59 (Gen4+N is the number these notes give, 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) includes a carousel module, off by default, that groups 3–5 vertical videos. The previous day's commit (2e2295b) created a path that orders videos inside the carousel with a carousel-specific CTR (click-through rate) model instead of a hand-tuned weighted sum, but the model name to fetch was an empty string. With an empty name, the path cannot fetch a model even if it is turned on. This commit filled in the default for that model name and also changed one processing rule of the account enforcement service.
What we learnedA. A model is now named for the carousel CTR path, but the path is still off
- The default for the carousel CTR model name changed from an empty string to a specific model name verified —
home-mixer/params/param.rs:1272-1276.- The parameter is
VideoCarouselCtrModelNameand its value is"lr_v8_search_video_1_2026-11-03_no_high_risk". - This value came from the cron mirror (a sync that copies X's internal feature switch defaults into this file every day). The sync time in the file's header comment is 2026-11-06T16:00:45Z.
- The parameter is
- The switch that turns the path on and the carousel itself are still off by default in this commit verified — same file:1224-1270.
EnableVideoCarouselandEnableVideoCarouselCtrModelare bothfalse.- The query hydrator that fetches the model runs only when both switches are on —
query_hydrators/video_carousel_ctr_model_query_hydrator.rs.
- The model is likely the 8th version of a logistic regression, trained on 2026-11-03 on data that excluded brand-safety HighRisk videos inferred — an interpretation read from the
lr_v8, date, andno_high_riskpieces of the name.- The
search_videopiece of the name may mean it was trained on video data from the search surface, but the training code is not public, so we cannot confirm it inferred.
- The
What we learnedB. An account enforcement classification head with no control record now only records instead of acting
- The handling changed in abuse-enforcement-service (AES, a service that takes label, challenge, and suspension actions on accounts based on model scores). A classification head (one output of a classification model) that no control record names no longer follows the default rule of taking action, and is only recorded in Recording mode verified —
service-lib/src/action_control.rs:1079-1098.- Previously, when the repository had no record at all, it fell straight back to the default (apply the rules), and it also followed the rules when only other heads had records. The deleted test was named
no_record_follows_the_rules. - The new test
a_head_no_record_names_records_onlyexpectsControlMode::Recording, an empty action list, and the record reasonno_selectionin both cases. - If the head name is empty or malformed, it returns the default as before.
- Previously, when the repository had no record at all, it fell straight back to the default (apply the rules), and it also followed the rules when only other heads had records. The deleted test was named
- When such a head is first saved, saving it narrowed to a classifier or band level is blocked. The record for the whole head must be saved first verified — same file:902-913.
- The error code is
unknown_head_needs_head_record. A head saved for the first time has a setting on by default that lets verdicts not in the topic's label list pass.
- The error code is
"save the whole head first, so its decisions keep getting past the topic's label list"
What we learnedOther changes
- A deterministic performance test and benchmark that runs the entire For You candidate pipeline with 3,000 candidates was added verified —
candidate_pipeline/performance_tests.rs.- The accompanying
performance_params.jsonis a test configuration that turns off most switches and sets weights to 0. It should not be read as production defaults. - The test checks 15 components that must be connected (PhoenixSource, PreviouslySeenPostsFilter, VMRanker, VFFilter, and others).
- The accompanying
- The cache hydrator was changed so that it does not copy the candidate list when there are no cache hits at all verified —
candidate-pipeline/hydrator.rs. - The TTL of the ads impression history cache changed from a constant to the parameter
AdsHistoryCacheTtlSecs, and its default is 300 seconds, the same as before verified —side_effects/served_ad_history_cache_side_effect.rs. DISTILLED_FEEDBACK_RELEVANT_TO_SEARCH(No. 114) was added to the action list of Phoenix (X's Grok-based ranking Transformer). No code uses it in this commit verified —recsys.proto.
Canon update services/x.md Added a sub-bullet under the CTR model path bullet of the carousel entry in ## Feed surfaces, recording the default model name and the off state of the switch. Moved the git log reference in ## Sources to 2026-11-08, 3b6919f, and added a Gen4+59 row to the change log summary table.
Why it matters X actually trained the carousel CTR model and settled its name, so all that remains is turning the switch on. The evidence is that the model name left empty in the path built the day before was filled within a day with the name of a dated training artifact. However, because both the carousel and the CTR path are off by default, For You behavior does not change as of 3b6919f.
What to check next
- Whether the switch for the carousel CTR path or for the carousel itself gets turned on — if so, carousel ordering changes from the weighted sum to a trained model.
- What search_video in the model name means — whether the training data came from the search surface remains inferred.
- Code that uses the DISTILLED_FEEDBACK_RELEVANT_TO_SEARCH action — it is not yet known whether X intends to use feedback distilled from search relevance as a label.
- The Reddit RSS shutdown (2026-11-13) — we need to decide in advance how to look up r/RedditEng afterward.
Lookup failed: ai.meta.com/blog — the list only shows posts up to 2026-07, so we could not confirm recent posts