Tutorials

X's October 31 Algorithm Diff: Ad Slots, Video Risk, and Caveats

A code-grounded audit of X's October 31 recommendation snapshot: the ads blender default moves to slot_spread and a carousel risk flag changes, but neither proves a live rollout.

Approximately 8 min read

A social platform’s recommendation algorithm is easy to sensationalize. A changed parameter becomes a claim that everyone’s feed changed; a safety flag becomes a claim that the platform banned a category of content; an ads setting becomes a prediction about revenue. The October 31, 2026 UTC snapshot of X’s public recommendation code offers a better opportunity: inspect the actual diff, follow the relevant execution paths, and distinguish what the code establishes from what only production data could establish.

The comparison against the October 30 snapshot contains 52 changed files. Two parameter changes stand out:

These are verified changes in the published source snapshot, not proof that a live feed experiment or a universal production rollout occurred. The repository describes feature-switch defaults mirrored from configuration; live overrides, traffic allocation and deployment state are not established by a public Git commit.

What changed in the parameter file

The precise evidence is in home-mixer/params/param.rs. The relevant changes are small enough to express without a screenshot:

AdsBlenderType:
  previous default: multi_risk
  new default:      slot_spread

EnableVideoCarouselHighRiskFilter:
  previous default: false
  new default:      true

The same snapshot adds a PageDecodeRewardHead parameter and a VideoCarouselEmbeddingVersion parameter. Those additions are worth tracking, but they do not by themselves demonstrate a new ranking objective, new model weights or a deployed carousel.

The file header identifies the parameters as mirrored feature-switch defaults. A default is the value used when a different value is not supplied. A production configuration service can override it. Thus the safe statement is: the checked-in fallback selection changed. The unsafe statement is: “X changed every user’s ad placements on October 31.” No user-level measurements or rollout announcement accompanies this diff.

This distinction is particularly important when social-media commentators use public source code as a proxy for live platform behavior. Open code is evidence about implementation; it is not an automatically authenticated observation of the service.

Follow the ads blender dispatch

The BlenderSelector implementation reads AdsBlenderType from the query’s parameters and dispatches to a concrete strategy. The match includes multi_risk, slot_spread, safe_gap, partition_organic_low_risk, least_movement and time_gap. Unknown values fall back to partition_organic.

That means slot_spread is not a speculative string that the selector cannot recognize. It has an implementation, and the October 31 parameter default points to that implementation. But the presence of a branch is not a guarantee that the branch ran for a particular request.

The source provides a useful three-layer model:

  1. Configuration layer: which blender name is selected for this request?
  2. Algorithm layer: given posts and ads, where can ads be inserted while respecting constraints?
  3. Serving layer: which candidates, overrides, eligibility signals and business rules actually reach that algorithm in production?

The public snapshot strongly informs the first two layers. It cannot independently answer the third.

What slot_spread actually does

The SlotSpreadAdsBlender source is not simply “show more ads.” It begins by checking whether ads are present and whether there are enough organic posts. It then computes requested spacing, a page-slot capacity and an estimate of safe placements based on available neighboring content. If the effective slot count is zero, it records a drop reason rather than inserting an ad indiscriminately.

The function named spread_slots distributes prospective placements across the organic items. The assignment routine then looks for eligible organic neighbors, using a NeighbourChecker and risk classes. It may swap organic items to satisfy placement constraints. If an ad cannot obtain acceptable neighbors, the algorithm records a drop instead of silently treating every slot as valid.

Two details matter to readers evaluating claims about ad load and brand safety.

Spacing is constrained, not arbitrary. The algorithm considers requested spacing and page capacity. It cannot be reduced to “one ad every N posts” without inspecting the actual request inputs, capacity and eligibility outcomes.

Neighbor compatibility is active. The algorithm distinguishes safe, low, medium and high classes and uses rule-dependent compatibility checks. A sensitive ad may require two safe neighbors. Other cases may allow low-risk neighbors subject to further checks. There are explicit drop reasons for insufficient eligible neighbors or spacing limits.

The previous MultiRiskAdsBlender groups organic posts by risk class and constructs placements from those groups. SlotSpread instead works with prospective spread positions and local neighbor selection. That is an architectural difference in how ad placement is assembled. Whether it increases ad fill, changes adjacency risk or affects organic ranking requires matched experiments, not a name comparison.

An operational test should report ads offered, ads placed, drop reasons, final page size, organic order displacement and brand-safety violations under the same candidate and ad inputs for both strategies. Without those numbers, a claim of improved monetization or safety is conjecture.

The video safety flag has a hidden gate

The second changed default is more easily misunderstood. In video_carousel_filter.rs, the filter reads EnableVideoCarouselHighRiskFilter. When enabled, the candidate selection path excludes videos whose brand_safety_verdict is HighRisk. The source condition also requires a verdict to be present: an unknown verdict does not pass that particular predicate when the flag is on.

But this filter’s own enable() method delegates to video_carousel::is_enabled. That helper requires all of the following: a ForYou request, the EnableVideoCarousel feature switch, carousel eligibility for the query and a request that is not a bottom request.

Crucially, the published default for EnableVideoCarousel remains false in the same parameter file.

Therefore the change from false to true for the high-risk filter is not evidence that a new video carousel was activated for all users. It changes behavior if the carousel path is enabled and the relevant parameter is not overridden. It does not establish whether a live feature switch turns the carousel on for any given audience.

It also does not establish that the main feed’s entire safety pipeline changed. The code inspected here is the carousel candidate selection path, not a platform-wide content moderation policy. Treating it as proof of an X-wide ban or censorship event would be an unsupported extrapolation.

Why the two changes belong in one audit

Both changes concern how ranked content is assembled after earlier selection and scoring decisions. The ads blender decides how to interleave advertising with organic posts under adjacency constraints. The carousel filter decides which candidate videos may be assembled into a specific module under eligibility and safety conditions.

Neither is equivalent to changing the Phoenix model’s prediction weights or to altering every user’s organic feed ranking. A feed is the result of multiple stages: candidate retrieval, eligibility filtering, scoring, diversity, module selection and blending. A change in a late-stage selector can visibly affect the final page while leaving earlier model predictions unchanged.

This matters for public discussion because “the algorithm” is not a single number. A more precise question is: which stage changed, which inputs reach it, which feature switches gate it and which outputs can we measure?

The public repository README also warns against a common ranking myth: published action weights scale predicted action probabilities, not raw engagement counts. That same caution applies here. A source-visible parameter is not a simple formula for how many ads or videos a person will see.

A falsifiable comparison, without live-user data

The most useful independent follow-up is a deterministic offline test, not a screenshot of a feed. Pin the October 30 and October 31 source commits, then supply a fixed synthetic candidate set to each relevant selector. Construct at least four scenarios:

Scenario Expected diagnostic question
Many safe organic posts and multiple ads Do slot positions or organic displacement differ between blenders?
Too few organic posts Are ads rejected for minimum-post constraints?
Mixed risk classes and sensitive ads Which adjacency rules reject or permit placements?
Carousel eligible, with high-risk and missing verdicts Does the filter remove those candidates only when the carousel and risk flag are enabled?

For the ads experiment, override AdsBlenderType explicitly to multi_risk and slot_spread on the same revision, then repeat across the two revisions. This separates a change in default selection from a change in the underlying implementations. Record exact candidate IDs, risk labels, ad requirements, order and all drop reasons. No live platform data is needed to test these source-level behaviors.

For the carousel experiment, vary EnableVideoCarousel and EnableVideoCarouselHighRiskFilter independently. Include a HighRisk verdict, a non-HighRisk verdict and an absent verdict. The prediction from the inspected code is conditional: when the carousel is enabled and the high-risk filter is on, only candidates with a present verdict other than HighRisk pass that predicate. That prediction is testable. Whether production uses the same configuration is a different question.

RAMGPT has not executed these experiments. The table is a proposed test plan derived from inspected source code, not a report of observed performance.

What we still do not know

The October 31 commit does not establish whether X deployed these exact defaults globally, in an experiment, or not at all. It does not provide an A/B assignment, live feature-switch overrides, ad fill rates, user dwell-time changes, creator impressions, click-through rates or revenue effects. Nor does it show that an individual user’s feed was altered because of these two lines.

No Google Trends time series or independent social-traffic measurement was obtained for this article. Viral reach, search demand and advertising impact are unknown, rather than assumed from the existence of a source-code diff.

That is not a reason to ignore the change. It is a reason to report it accurately. The source snapshot verifies a meaningful engineering choice: the fallback ad-blending strategy now selects a spacing-aware placement algorithm with explicit neighbor checks, while a risk filter is enabled by default inside a separately gated carousel path.

The next credible headline would require either a documented production rollout or controlled evidence of user-visible effects. Until then, the defensible conclusion is narrower: X’s public October 31 code changes how two recommendation-stage defaults are expressed, but it does not prove that the live platform changed for everyone.

Sources and further reading

Continue reading

More in Tutorials ↗