0x00 한

Research / Daily reports

  • Sources read: 1
  • Canon files updated: 1
  • Radar entries: 0
In one lineX set the default name of the CTR model for the For You video carousel. The path switch that uses the model is still off, so current behavior is unchanged.

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 VideoCarouselCtrModelName and 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 switch that turns the path on and the carousel itself are still off by default in this commit verified — same file:1224-1270.
  • 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, and no_high_risk pieces of the name.
    • The search_video piece 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.

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_only expects ControlMode::Recording, an empty action list, and the record reason no_selection in both cases.
    • If the head name is empty or malformed, it returns the default as before.
  • 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.
"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.json is 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 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