x-algorithm changelog (unofficial)

Unofficial, community-maintained project. Not affiliated with, endorsed by, or operated by X Corp. or xAI. Notes are generated from the public git history of xai-org/x-algorithm and may contain mistakes; the upstream diff is the source of truth.

x-algorithm changelog (unofficial)

Plain-English developer notes for every sync of xai-org/x-algorithm, the open-source X “For You” recommendation algorithm. Upstream commits are published by a CI agent and all carry the same message (“Open-source X Recommendation Algorithm”), so this site reads each diff and writes down what actually changed: new or removed filters, scorers and candidate sources, ranking-weight and parameter changes with old → new values, and new feature flags.

45 entries · newest first · subscribe via Atom

Current ranking-weight defaults (30)

Defaults of *Weight param!s at upstream HEAD (home-mixer/params/param.rs and vm-ranker/params.rs). These multiply the model's predicted probabilities of each action for a given viewer, not raw engagement counts (see the upstream README). Production values can be overridden by feature switches.

Weighthome-mixervm-rankerLast changed
BidirectionalFollowDwellWeightBoost0.00.0—
BidirectionalFollowReplyWeightBoost15.015.0—
BlockAuthorWeight-31.2-31.2—
ClickWeight0.30.3Sep 29, 2026 (was 0.4)
ContClickDwellTimeWeight0.40.4Sep 29, 2026 (was 0.0)
ContDwellTimeWeight0.0040.004—
DwellWeight0.050.05Aug 25, 2026 (was 0.0)
FavoriteWeight0.50.5—
FollowAuthorWeight4.04.0—
MuteAuthorWeight-58.8-58.8—
NotDwelledWeight-0.02-0.02—
NotInterestedWeight-47.52-47.52Sep 29, 2026 (was -43.2)
OpenLinkWeight0.20.2—
PhotoExpandWeight0.050.05—
PostUnexploredWeight0.0150.02Oct 7, 2026 (was 0.02)
ProfileClickWeight0.00.0—
ProfileVisitSecsWeight—0.0—
QuoteWeight5.05.0—
QuotedClickWeight0.050.05—
QuotedVqvWeight0.00.0—
ReplyWeight5.05.0—
ReportWeight-234.0-234.0—
RetweetWeight1.01.0—
ShareViaCopyLinkWeight20.020.0—
ShareViaDmWeight5.05.0—
ShareWeight2.02.0—
UserVideoContinuationWeight—0.0—
VideoContinuationWeight—0.0—
VideoOpenWeight0.070.07Aug 25, 2026 (was 0.05)
VqvWeight0.00.0Aug 25, 2026 (was 0.05)

Full parameter history →

· cb45b55 · 16 files, +1,228/−218

Code changes in phoenix/, grox/ and home-mixer/ (16 files).

numeric tweaksschema
  • Other literal values changed in code: bs_per_device 256→512 (xrecsys.py) and ep 256→128 (xrecsys.py).
  • Proto/Thrift schema: 2 fields added (e.g. PredictNextActionsRequest.feed_cursor_direction and PredictNextActionsRequest.feed_request_context).
  • Most activity in phoenix/ (+1,215/−217), grox/ (+12/−0) and home-mixer/ (+1/−1).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 35650fb · 173 files, +15,160/−2,465

Vertical video carousel added to For You (off by default)

candidate hydratorscandidate sourcesconstantsfiltersnumeric tweaksparams
  • New flag EnableVideoCarousel (default off), plus VideoCarouselPosition = 6 and VideoCarouselFatigueMinutes = 60.
  • When enabled on a For You request, the pipeline sets aside up to VIDEO_CAROUSEL_EXTRA_CANDIDATES = 30 extra video candidates (top by predicted video-open). The new VideoCarouselFilter and util/video_carousel.rs then pick 3–5 non-reply videos whose aspect ratio is below 1.0 (the code's is_vertical check), ordered by predicted video-open probability. No carousel is shown if fewer than 3 qualify.
  • New video_aspect_ratio_hydrator supplies the aspect ratio. FEED_MODULE_SLOTS 4 → 5.
  • New ads/drops.rs. Large Phoenix training/model changes in the same sync.

Full analysis → Summary: hand-written notes, checked against the diff

· 78460ca · 22 files, +775/−681

Popular-posts source turned on; post-unexplored weight 0.02 → 0.015

feature flagsranking weights
  • EnablePopularPostsSource now on by default. The README adds it as a third out-of-network source next to Phoenix retrieval and SimClusters: "a shared list of popular recent posts, initially from the most-followed active accounts."
  • PostUnexploredWeight 0.02 → 0.015.

Full analysis → Summary: hand-written notes, checked against the diff

· e62790c · 103 files, +6,916/−1,393

New zero-weighted heads (video continuation, profile visit time); popular posts precomputed

numeric tweaksparamsschema
  • New ranking weights, all at 0.0 for now: VideoContinuationWeight, UserVideoContinuationWeight and ProfileVisitSecsWeight, defined in vm-ranker/params.rs. The shared xai-value-model crate gets matching heads (its weight list grows from 25 to 28 entries). Home-mixer's own value_model.rs hard-codes the two video-continuation weights to 0.0, so for now these heads don't change scores.
  • New flag PostUnexploredIncludeOutOfNetwork (vm-ranker/params.rs, default off). Without it, the value model's post-unexplored bonus applies only to in-network candidates.
  • PopularPostsSource now reads from a precomputed PopularPostsCache (new util/popular_posts.rs, filled by new popular_posts_job.rs / popular_authors_job.rs) instead of querying Thunder on each request. PopularPostsTopAuthors, PopularPostsMaxPerAuthor and PopularPostsMaxRepliesRepostsPerAuthor leave param.rs.
  • New flags EnableUnderTheHood and EnableHomeExcursionScores (both off).
  • RetrievalCandidatesKafkaMaxCandidates 200 → 100000. VMRankerClusterId "Experiment6" → "Experiment1".

Full analysis → Summary: hand-written notes, checked against the diff

· b412112 · 148 files, +9,128/−2,356

Popular-posts candidate source added (off by default); brand-safety verdict v2 back on

candidate hydratorscandidate sourcesconstantsfeature flagsnumeric tweaksparamsside effects
  • New candidate source PopularPostsSource (home-mixer/sources/popular_posts_source.rs), behind EnablePopularPostsSource (default off). It fetches recent posts by popular authors (PopularPostsTopAuthors = 1000) from Thunder, capped at PopularPostsMaxResults = 500 and PopularPostsMaxPerAuthor = 3, with no replies or reposts (PopularPostsMaxRepliesRepostsPerAuthor = 0).
  • EnableAdsBrandSafetyVerdictV2 goes back to on (it was switched off on Sep 16).
  • New flags/params, all off or zero by default: EnablePhoenixOonReplies, AuthorExplorationBonus = 0.0, EnableAdsAuthorBrandSafetyFallback, VMRankerSendPacingInputs.
  • New phoenix_reply_ancestors_hydrator and a served_event_kafka side effect.
  • The README's Brazil-filter note now reads "Account list updated September 29, 2026."

Full analysis → Summary: hand-written notes, checked against the diff

· 76843a5 · 105 files, +5,227/−756

New semantic-ID candidate source (off by default)

candidate sourcesconstantsnumeric tweaksparamsschema
  • New candidate source SidSource (home-mixer/sources/sid_source.rs) that retrieves posts through a new SidRetrievalClient (seeded with up to SidSourceMaxSeeds post IDs taken from the viewer's signals via post_signal_ids). It is gated by EnableSidSource (default off) with SidSourceMaxResults = 800, SidSourceMaxSeeds = 50, SidSourceMaxPerSeed = 100 and SidSourceMinPrefixDepth = 3.
  • Removes the TestBoost and TestCap params.
  • Many proto/schema additions and Phoenix changes in the same sync. See the full analysis.

Full analysis → Summary: hand-written notes, checked against the diff

· b79b947 · 47 files, +2,490/−506

1 new config parameter and code changes in visibility-filtering/, abuse-enforcement-service/ and phoenix-rankall/.

numeric tweaksparams
  • Added 1 config parameter: FeedSurveyFatigueMinutes = 1440.
  • Removed 1 config parameter: FeedSurveyFatigueHours.
  • Other literal values changed in code: (2, failed()), 1→2 (fallback_cache.rs), (1, failed()), 2→1 (fallback_cache.rs) and fn verdict_cases() -> [(Verdict, Projected); 15] { 14→15 (treatment.rs).
  • Most activity in visibility-filtering/ (+1,566/−300), abuse-enforcement-service/ (+713/−150), phoenix-rankall/ (+139/−33), phoenix/ (+45/−11) and home-mixer/ (+9/−11).

Full analysis → Summary: automatic analysis

· 77d431a · 69 files, +3,306/−1,489

Cold-start boost for small accounts retuned and Thompson sampling enabled

feature flagslistsparams

This sync changes the defaults of the author cold-start mechanism (home-mixer/scorers/author_cold_start.rs). Per request, it picks one eligible fresh post from a smaller account and raises its score to whatever score sits at a fixed rank, which is index 15 given ColdStartSlotMin = 15 and ColdStartSlotMax = 16.

  • ColdStartFollowerCap 1000 → 50000: authors with up to 50k followers are now eligible.
  • ColdStartImpressionThreshold 1000 → 200: the post must have fewer than 200 Home impressions.
  • ColdStartMaxPostAgeSecs 172800 → 7200: the post must be under 2 hours old (was 48h).
  • LowImpressionsMaxPositionRatio 0.85 → 0.97: candidates from deeper in the ranked list can qualify.
  • EnableColdStartThompsonSampling now on by default. Instead of taking the highest-scored eligible post, the scorer samples a Beta(0.75 + likes, 49.25 + impressions − likes) reward per post, keeps the top ColdStartTsTopK (2), and boosts the higher-scored of those.
  • PhoenixColdStartMaxResults 0 → 200: the Phoenix cold-start retrieval path is switched on.
  • The Brazil election list goes from 2,786 to 2,795 accounts.

Full analysis → Summary: hand-written notes, checked against the diff

· a707cc2 · 89 files, +9,552/−2,325

Ranking weights: click 0.4 → 0.3, click-dwell 0 → 0.4, not-interested −43.2 → −47.52

numeric tweaksparamsranking weightsschema
  • Weight changes, made identically in home-mixer/params/param.rs and vm-ranker/params.rs: ClickWeight 0.4 → 0.3. ContClickDwellTimeWeight 0.0 → 0.4, so predicted time spent after clicking into a post now counts. NotInterestedWeight -43.2 → -47.52, a 10% larger penalty.
  • Cold-start holdout: in author_cold_start.rs the MoE "ranking policy" that zeroed arm-gated retrieval candidates for non-treatment viewers is removed, along with the author_policy_zeroed field. Holdout viewers no longer exclude arm-gated retrieval candidates from cold-start eligibility.
  • New flag PhoenixRetrievalExcludeSeenPosts (default off). When on, Phoenix retrieval is sent the viewer's seen/served post IDs and impression bloom filters so it can skip posts already shown.
  • The ads request now forwards the client's seen post IDs (client_seen_post_ids).
  • Removed flag: UseEngagementCounterViewCountForImpressionBoost.
  • README: documents abuse-ledger-service/. When an enforcement is overturned on appeal, it is not re-applied for a fixed period.

Full analysis → Summary: hand-written notes, checked against the diff

· 4c5cfe8 · 80 files, +9,130/−2,652

Removed candidate hydrators safety_label_hydrator and tes_hydrator and other changes.

candidate hydratorsconstantsnumeric tweaksschema
  • Removed candidate hydrators: safety_label_hydrator and tes_hydrator.
  • Renamed: gizmoduck_hydrator → author and viewer_hydrator → viewer.
  • Constants changed: GEMMA_REPLY_SPAM_MIN_FOLLOWERS 150_000 → 125_000 (constants.py) and FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 100_000 → 125_000 (task_filter.py).
  • Other literal values changed in code: rows 14→15 (execute.rs) and timeline_home_hydration 10→11 (plan.rs).
  • Proto/Thrift schema: 18 fields added (e.g. PostActionScores.action_indices, PostActionScores.found, PostActionScores.num_posts, PostActionScores.post_action_masks and 14 more).
  • Most activity in abuse-enforcement-service/ (+6,060/−7), visibility-filtering/ (+2,177/−1,937), phoenix/ (+811/−689), home-mixer/ (+62/−8) and grox/ (+20/−11).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· bf7db1b · 87 files, +7,780/−5,759

Removed candidate hydrators conversation_control_hydrator, exclusive_content_hydrator and socialgraph_hydrator and other changes.

candidate hydratorsconstantslistsnumeric tweaksschema
  • Removed candidate hydrators: conversation_control_hydrator, exclusive_content_hydrator and socialgraph_hydrator.
  • Constants changed: KEY_FRAMES_UNCONDITIONAL_FAV 512 → 1024 (constants.py).
  • Other literal values changed in code: TIMELINE_HOME_RECOMMENDATION_ONLY_RULES 5→9 (registry.rs).
  • Static list BRAZIL_2026_ELECTION_USER_IDS (brazil_2026_election_filter.rs) grew from 2,776 to 2,786 entries (per its in-file test assertion).
  • Proto/Thrift schema: 1 field added (e.g. AdInfo.unified_card_type).
  • Most activity in visibility-filtering/ (+6,329/−5,545), grox/ (+534/−153), under-the-hood/ (+616/−0), phoenix/ (+256/−52) and home-mixer/ (+23/−3).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 44d37eb · 63 files, +2,569/−2,257

Ranking scorer rewritten as a shared xai-value-model crate

constantsfiltersparamsschemascorers
  • home-mixer/scorers/ranking_scorer.rs (1,255 lines) is deleted. It's replaced by a 114-line home-mixer/scorers/value_model.rs that maps feature-switch params into a ValueModelWeights struct and calls fuse_heads from a new top-level crate, xai-value-model/ (scoring.rs, weights.rs, inputs.rs, …).
  • In this version, home-mixer's weights_for hard-codes enable_author_diversity: false, oon_rescore_in_network_replies_retweets: false and multiplier_pre_offset: false.
  • 22 params leave home-mixer/params/param.rs. Eleven of them (author diversity, the OON weight factors, MultiplierPreOffset, WeightPerturbation*, …) are still defined in vm-ranker/params.rs. The other eleven aren't defined as params anywhere else, including EnableVMRanker, CachedPostsReuseWeightedScore, EnableMultiplicativePostUnexplored and the VMRankerDpp* settings.
  • VMRankerClusterId changes from "Experiment3" to "Experiment6".

Full analysis → Summary: hand-written notes, checked against the diff

· 1b3fec2 · 92 files, +4,993/−3,132

vm-ranker can now compute the value model itself (off by default)

candidate hydratorsconstantsfiltersnumeric tweaksparamsschemascorers
  • vm-ranker/ gets its own params.rs with 44 param! defaults. These include 27 ranking weights that mirror home-mixer's names, keys and current defaults (all of home-mixer's weights except ContActiveSecs5mResidualNormWeight; e.g. FavoriteWeight = 0.5, ReplyWeight = 5.0), plus DPP settings (DppEnabled on, DppTheta = 0.65, DppMaxSelectedRank = 150) and author-diversity settings (EnableAuthorDiversity on, AuthorDiversityDecay = 0.5, AuthorDiversityFloor = 0.25).
  • New vm-ranker/scoring/value_model.rs builds value-model weights from those params (weights_from_params). It is gated by ComputeValueModel, which defaults to off. New ranking_config.rs and config_sync.rs files are added alongside.
  • Home-mixer side: new vm_ranker_debias_payload.rs and a VMRankerSendDebiasInputs flag (off). PhoenixMOEMaxResults 200 → 0 and PhoenixMoeColdStartMaxResults 0 → 200. PhoenixRetrievalMOEInferenceClusterId "Experiment3Memy04" → "Experiment2Memy04".
  • Grox: GROK_GEMMA_FOLLOWER_SPLIT 200_000 → 225_000.

Full analysis → Summary: hand-written notes, checked against the diff

· 3aa0fa3 · 72 files, +5,588/−2,601

New scorer vm_ranker_request and other changes.

constantsnumeric tweaksparamsscorersside effects
  • Added 2 feature flags: VMRankerComputeValueModel (default off) and VMRankerSendValueModelInputs (default off).
  • Added 5 config parameters: NewUserOonWeightFactor = 0.00001, PhoenixMoeColdStartMaxResults = 0, RetrievalCandidatesKafkaMaxCandidates = 200, RetrievalCandidatesKafkaSamplePercent = 5.0 and SimclustersMaxCandidateAgeHours = 48.
  • New scorer: vm_ranker_request.
  • New side effect: retrieval_candidates_kafka_side_effect.
  • Constants changed: FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 50000 → 80_000 (task_filter.py) and HYDRATION_TIMEOUT Duration::from_millis(390) → Duration::from_secs(1) (mod.rs).
  • Other literal values changed in code: (4, tonic::Code::Unimplemented), 82→4 (evaluate_tweets.rs) and Some(&2) 1→2 (metrics.rs).
  • Most activity in visibility-filtering/ (+2,701/−1,442), phoenix/ (+1,371/−877), home-mixer/ (+1,075/−234), phoenix-rankall/ (+337/−44) and grox/ (+104/−4).

Full analysis → Summary: automatic analysis

· 8b25829 · 41 files, +2,877/−1,828

"Dwell regret" scoring gate removed; Under the Hood shows legal withholding

paramsscorers
  • Removed scorer value_model_gate (537 lines). It was a per-viewer linear gate: it scored features from the viewer's recent action sequence and compared the score to a threshold to decide whether ranking_scorer should use the alternative "dwell regret" scoring path. Inside the hysteresis band, a hash of the user ID made the call. With it go 18 params: every DwellRegret* alpha/negative/gate/temperature param and ValueModelMode. ranking_scorer.rs loses 465 lines and gains 12.
  • New param PhoenixColdStartMaxResults (default 0, i.e. off). PhoenixRetrievalMOEInferenceClusterId changes from "Experiment2Memy04" to "Experiment3Memy04".
  • Under the Hood: the README's "September 18th, 2026" note says reports now show whether an account's or post's visibility was limited for legal compliance (e.g. withheld in a specific country). That matches the changes to UthPctdAccountTakedownEventsJob.scala and underTheHoodLabels.strato.
  • Visibility filtering gets a new tes_composite hydration path and a batch evaluate_tweets API.

Full analysis → Summary: hand-written notes, checked against the diff

· c279172 · 30 files, +1,491/−154

New filter task_safety_ptos_media_injected_adult_infrared_video_spam_detection_filter and other changes.

filterslistsschema
  • New filter: task_safety_ptos_media_injected_adult_infrared_video_spam_detection_filter.
  • Static list BRAZIL_2026_ELECTION_USER_IDS (brazil_2026_election_filter.rs) grew from 2,707 to 2,776 entries (per its in-file test assertion).
  • Proto/Thrift schema: 12 fields added (e.g. AdInfo.engagement_counts, EngagementCountRow.action, EngagementCountRow.counts, EngagementCounts.present and 8 more).
  • Most activity in phoenix/ (+423/−81), abuse-enforcement-service/ (+433/−62), grox/ (+489/−6), home-mixer/ (+144/−5) and visibility-filtering/ (+2/−0).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 42266f3 · 64 files, +2,288/−3,627

New filter fav_holdout_filter and other changes.

constantsfiltersnumeric tweaksparams
  • Parameter defaults changed: ColdStartMaxPostAgeSecs: 86400 → 172800.
  • Added 2 feature flags: EnableCdwellOnImpr (default off) and EnableFavHoldout (default off).
  • Removed 1 feature flag: EnableClickDwellLowFavRatePenalty.
  • Removed 4 config parameters: ClickDwellLowFavRatePenaltyAlpha, ClickDwellLowFavRatePenaltyBaseline, ClickDwellLowFavRatePenaltyCap and ClickDwellLowFavRatePenaltyFloor.
  • New filters: fav_holdout_filter and RedactUnenforcedTakedownsFilter.
  • Constants changed: GROK_GEMMA_FOLLOWER_SPLIT 180_000 → 200_000 (constants.py) and FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 30000 → 50000 (task_filter.py).
  • Other literal values changed in code: reserved 234 to 252; 214→234 (recsys.proto) and reserved 234 to 252; 214→234 (recsys.proto).
  • Most activity in visibility-filtering/ (+84/−3,301), under-the-hood/ (+1,477/−137), home-mixer/ (+199/−112), phoenix/ (+148/−72) and takedowns/ (+218/−0).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· fad2f71 · 26 files, +552/−233

Feature switches flipped: enable ads brand safety verdict v2 off.

feature flags
  • Feature switches flipped: EnableAdsBrandSafetyVerdictV2 (enable ads brand safety verdict v2) is now OFF by default.
  • Most activity in phoenix/ (+437/−38), visibility-filtering/ (+53/−184), grox/ (+38/−7), abuse-enforcement-service/ (+20/−1) and home-mixer/ (+4/−3).

Full analysis → Summary: automatic analysis

· 2d4a03c · 17 files, +594/−9

New side effect response_diversity_stats_side_effect and other changes.

constantsnumeric tweaksparamsschemaside effects
  • Added 1 feature flag: EnableResponseDiversityStatsExperimentBucket (default off).
  • New side effect: response_diversity_stats_side_effect.
  • Constants changed: metrics_export_interval_ms 30_000 → 120_000 (kafkaloader.py).
  • Other literal values changed in code: FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 10000→30000 (task_filter.py) and export_interval_ms 30_000→120_000 (kafkaloader.py).
  • Proto/Thrift schema: 4 fields added (e.g. PredictNextActionsRequest.purchase_value_baselines, PurchaseValueBaseline.advertiser_account_id, PurchaseValueBaseline.impression_id and PurchaseValueBaseline.mean_value_usd_28d).
  • Most activity in home-mixer/ (+457/−5), phoenix/ (+136/−3) and grox/ (+1/−1).

Full analysis → Summary: automatic analysis

· 6bb4594 · 24 files, +1,397/−338

Code changes in home-mixer/, phoenix/ and visibility-filtering/ (24 files).

listsschema
  • Static list BRAZIL_2026_ELECTION_USER_IDS (brazil_2026_election_filter.rs) grew from 2,554 to 2,707 entries (per its in-file test assertion).
  • Proto/Thrift schema: 2 fields added (e.g. NextActionDistribution.requestedActionLogits and PredictNextActionsRequest.returnLogitsList).
  • Most activity in home-mixer/ (+559/−98), phoenix/ (+311/−60), visibility-filtering/ (+282/−68), vm-ranker/ (+153/−41) and grox/ (+60/−55).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· fee1d0f · 33 files, +1,587/−391

Code changes in visibility-filtering/, grox/ and under-the-hood/ (33 files).

constantsnumeric tweaksschema
  • Constants changed: _MOTION_REVEAL_MAX_INPUT_FRAMES 32 → 48 (image.py) and _MOTION_REVEAL_DENSE_SAMPLES 32 → 48 (video_frames.py).
  • Other literal values changed in code: ("grpc.keepalive_timeout_ms", 20000), 5000→20000 (service.py) and ("grpc.http2.min_ping_interval_without_data_ms", 5 300000→5000 (service.py).
  • Proto/Thrift schema: 2 fields added (e.g. UthAccountLabelAggregate.countryCodes and UthPostLabelAggregate.countryCodes).
  • Most activity in visibility-filtering/ (+1,118/−355), grox/ (+291/−28), under-the-hood/ (+145/−0), phoenix/ (+27/−6) and home-mixer/ (+6/−2).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 75d93d9 · 28 files, +801/−252

Code changes in home-mixer/, visibility-filtering-client/ and grox/ (28 files).

  • Most activity in home-mixer/ (+452/−107), visibility-filtering-client/ (+137/−62), grox/ (+162/−31), phoenix/ (+42/−8) and candidate-pipeline/ (+3/−40).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 49815da · 78 files, +10,938/−982

New filter task_safety_ptos_adult_content_leading_frames_filter and other changes.

constantsfiltersnumeric tweaksparamsschema
  • Parameter defaults changed: PhoenixRetrievalMOEInferenceClusterId: "Experiment1Fou" → "Experiment2Memy04".
  • Added 2 config parameters: WeightPerturbationSalt = "" and WeightPerturbationSigma = 0.0.
  • New filter: task_safety_ptos_adult_content_leading_frames_filter.
  • Constants changed: FOLLOWER_COUNT_THRESHOLD_FOR_REPLY_RANKING 120000 → 150000 (task_filter.py), _MOTION_REVEAL_MAX_RESIDUAL_P99 75.0 → 100.0 (image.py), _MOTION_REVEAL_DENSE_SAMPLES 16 → 32 (video_frames.py) and AOT_CACHE_VERSION "20260705" → "20260904" (aot.py).
  • Other literal values changed in code: FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 120000→150000 (task_filter.py) and FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 5000→10000 (task_filter.py).
  • Proto/Thrift schema: 9 fields added (e.g. ContentFeatures.hasPhoto, ContentFeatures.hasUrl, ContentFeatures.hasVideo, ContentFeatures.maxVideoDurationMs and 5 more).
  • Most activity in phoenix/ (+8,569/−679), grox/ (+1,535/−74), home-mixer/ (+574/−141), candidate-pipeline/ (+105/−47) and visibility-filtering-client/ (+119/−0).

Full analysis → Summary: automatic analysis

· 902a06f · 25 files, +480/−179

Code changes in home-mixer/, visibility-filtering/ and phoenix/ (25 files).

schema
  • Proto/Thrift schema: 1 field added (e.g. PredictNextActionsRequest.experiment_overrides).
  • Most activity in home-mixer/ (+236/−75), visibility-filtering/ (+128/−61) and phoenix/ (+116/−43).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 9b0dc31 · 73 files, +1,954/−1,926

1 new config parameter and code changes in visibility-filtering/, phoenix/ and grox/.

constantslistsnumeric tweaksparams
  • Added 1 config parameter: PhoenixExperimentOverrides = "".
  • Constants changed: use_pinned_d2h False → True (model_runner.py).
  • Other literal values changed in code: FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 1000→5000 (task_filter.py), input_output_aliases 12→14, 13→15, 14→16 (ranker_attention_fa4.py) and default False→True (launch_inference.py).
  • Static list BRAZIL_2026_ELECTION_USER_IDS (brazil_2026_election_filter.rs) grew from 2,388 to 2,554 entries (per its in-file test assertion).
  • Most activity in visibility-filtering/ (+560/−1,511), phoenix/ (+425/−367), grox/ (+504/−19), home-mixer/ (+408/−29) and abuse-enforcement-service/ (+57/−0).

Full analysis → Summary: automatic analysis

· e4dcedd · 1 files, +2/−0 · merge

Community PR #88 merged: dedupe in-network IDs before visibility lookup

Merge of PR #88 from joshs1017dev. VFCandidateHydrator now sorts and dedups in_network_ids (sort_unstable() + dedup()) before calling visibility filtering, so duplicate IDs aren't looked up twice. Two lines changed. This is the only commit in the history from an outside contributor.

Full analysis → Summary: hand-written notes, checked against the diff

· 85ac72a · 34 files, +1,081/−525

Parameter changes: phoenix retrieval aggregation type "DENSE_WITH_SHORT_DWELL"→"DENSE_WITH_LONG_DWELL".

numeric tweaksparamsschema
  • Parameter defaults changed: PhoenixRetrievalAggregationType: "DENSE_WITH_SHORT_DWELL" → "DENSE_WITH_LONG_DWELL".
  • Other literal values changed in code: qk_norm False→True (xrecsys_two_tower.py) and attn_logit_cap 80.0→-1 (xrecsys_two_tower.py).
  • Proto/Thrift schema: 3 fields added (e.g. NextActionDistribution.backboneContinuousValues, NextActionDistribution.backboneTopLogProbs and PredictNextActionsRequest.returnBackboneScores).
  • Most activity in visibility-filtering/ (+392/−426), phoenix/ (+338/−93), scarecrow/ (+333/−0), home-mixer/ (+16/−4) and grox/ (+2/−2).

Full analysis → Summary: automatic analysis

· 7ba7768 · 34 files, +2,964/−2,861

Ads blender switched to "multi_risk"

paramsschema

AdsBlenderType (feature switch rust_home_mixer_ads_blender) changes from "partition_organic_low_risk" to "multi_risk". That makes the multi-risk blender added on Aug 28 the default for placing ads in the feed. Apart from home-mixer, this sync mostly touches visibility-filtering/rules/, phoenix/ and grox/.

Full analysis → Summary: hand-written notes, checked against the diff

· 6384ca7 · 70 files, +2,247/−735

New filter task_safety_ptos_special_video_filter and other changes.

filterslistsparamsschema
  • Added 1 feature flag: EnablePhoenixScoreStatsExperimentBucket (default off).
  • New filter: task_safety_ptos_special_video_filter.
  • Static list BRAZIL_2026_ELECTION_USER_IDS (brazil_2026_election_filter.rs) grew from 2,315 to 2,388 entries (per its in-file test assertion).
  • Proto/Thrift schema: 8 fields added (e.g. CandidateDistributionSet.pageDecodeResult, PageDecodeParams.poolN, PageDecodeParams.steps, PageDecodeParams.temperature and 4 more).
  • Most activity in visibility-filtering/ (+680/−203), phoenix/ (+438/−189), grox/ (+479/−19), home-mixer/ (+313/−94) and abuse-enforcement-service/ (+104/−173).
  • 3 files changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· bc8e5f0 · 24 files, +1,950/−1,175

1 new config parameter and code changes in visibility-filtering/, phoenix/ and home-mixer/.

params
  • Added 1 config parameter: RerankerHeadTag = 0.
  • Most activity in visibility-filtering/ (+1,825/−1,144), phoenix/ (+112/−27), home-mixer/ (+12/−3) and (repo root) (+1/−1).

Full analysis → Summary: automatic analysis

· 24c6094 · 41 files, +2,071/−265

New "multi-risk" ads blender

ads blendersconstantslists
  • New MultiRiskAdsBlender (home-mixer/ads/multi_risk_blender.rs). It places ads by the brand-safety verdict of the surrounding organic posts. It counts safe, medium-risk and high-risk posts, caps ad slots at half the safe posts (and half the medium-risk posts for the medium path), keeps the requested ad spacing, and records stats when ads can't be served (no_ads, too_few_posts, …). This commit doesn't make it the default (see Sep 1).
  • viewer_muted_keyword_filter and the response_stats side effect get small additions, and a strato_context helper is added.
  • The Brazil election list changes from 2,328 to 2,315 accounts.

Full analysis → Summary: hand-written notes, checked against the diff

· 45b48ba · 36 files, +873/−525

Code changes in phoenix/, visibility-filtering/ and grox/ (36 files).

schema
  • Proto/Thrift schema: 4 fields added (e.g. ConvAssetIds.asset_id, ConvAssetIds.author_id, ConvAssetIds.impressed_time_ms and PredictNextActionsRequest.conv_asset_ids).
  • Most activity in phoenix/ (+744/−172), visibility-filtering/ (+47/−341), grox/ (+73/−11) and home-mixer/ (+9/−1).
  • 1 file changed only in formatting, comments or sync metadata.

Full analysis → Summary: automatic analysis

· 0d3cdd8 · 47 files, +5,850/−586

Ranking weights: dwell 0 → 0.05, video open 0.05 → 0.07, VQV 0.05 → 0

candidate hydratorsconstantsfeature flagslistsnumeric tweaksparamsranking weights
  • Weight changes in home-mixer/params/param.rs: DwellWeight 0.0 → 0.05, VideoOpenWeight 0.05 → 0.07, VqvWeight (video quality view) 0.05 → 0.0.
  • PhoenixAggregationType default goes from "DENSE_WITH_SHORT_DWELL" to "DENSE_WITH_LONG_DWELL", and the shadow-traffic cluster list ShadowTrafficPhoenixClusterRates is emptied.
  • EnableAdsBrandSafetyVerdictV2 is now on by default. ColdStartTsTopK drops from 5 to 2.
  • Removed params: UseServedSlateContext, VMRankerValueModelId, VMRankerSendHeadWeights. EnableMpnScoring is replaced by a new MultiplierPreOffset flag. ranking_scorer.rs is reworked: the per-candidate effective_head_weights function is removed and the author-diversity code is restructured.
  • The author cold-start scorer now uses view_count_on_home (impressions on Home) instead of the overall view_count.
  • New following_blocked_by_hydrator flags retweets and quotes whose original author blocks the viewer.
  • The Brazil election list grows from 665 to 2,328 accounts, and the README adds an "Account list updated" note.

Full analysis → Summary: hand-written notes, checked against the diff

· d011592 · 19 files, +1,418/−117

Code changes in visibility-filtering/, grox/ and phoenix/ (19 files).

constantsnumeric tweaks
  • Constants changed: FOLLOWER_COUNT_THRESHOLD_FOR_REPLY_RANKING 80000 → 100000 (task_filter.py).
  • Other literal values changed in code: FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 80000→100000 (task_filter.py).
  • Most activity in visibility-filtering/ (+906/−6), grox/ (+294/−56), phoenix/ (+178/−36) and home-mixer/ (+40/−19).

Full analysis → Summary: automatic analysis

· 28e414f · 35 files, +856/−152

Code changes in phoenix/, grox/ and visibility-filtering/ (35 files).

constantsnumeric tweaksschema
  • Constants changed: FOLLOWER_COUNT_THRESHOLD_FOR_REPLY_RANKING 60000 → 80000 (task_filter.py).
  • Other literal values changed in code: mode 4.5→4.6 (classifier.py) and FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 60000→80000 (task_filter.py).
  • Proto/Thrift schema: 1 field added (e.g. NextActionDistribution.slateContext).
  • Most activity in phoenix/ (+835/−79), grox/ (+8/−66) and visibility-filtering/ (+13/−7).

Full analysis → Summary: automatic analysis

· d0cef2f · 14 files, +479/−200

New candidate hydrator ai_trend_feedback_context_hydrator and other changes.

candidate hydratorsconstantsparams
  • Added 2 feature flags: EnableAiTrendFeedbackContext (default off) and UseServedSlateContext (default off).
  • New candidate hydrator: ai_trend_feedback_context_hydrator.
  • Constants changed: _GROK_4_6_INTERNAL_DIAL 0.1 → 0.3 (classifier.py).
  • Most activity in phoenix/ (+189/−169), home-mixer/ (+255/−17) and grox/ (+35/−14).

Full analysis → Summary: automatic analysis

· aad7179 · 79 files, +3,303/−651

New filter following_viewer_muted_keyword_filter and other changes.

candidate hydratorsconstantsfiltersnumeric tweaksschema
  • New candidate hydrator: quoted_post_text_hydrator.
  • New filter: following_viewer_muted_keyword_filter.
  • Renamed: muted_keyword_filter → viewer_muted_keyword_filter.
  • Constants changed: MULTIPART_PART_SIZE 16 * 1024 * 1024 → 32 * 1024 * 1024 (checkpoint_store.rs).
  • Other literal values changed in code: mode 4.5→4.6 (classifier.py), learning_rate 1e-3→7.1e-4 (xrecsys.py), static_assert(sizeof(UpdateScalars) == 4 * sizeof( 3→4 (async_emb_kernel.hpp), input_output_aliases 12→14, 13→15, 14→16 (ranker_attention_varlen_fa4.py), input_output_aliases 12→14 (ranker_attention_varlen_fa4.py) and 2 more.
  • Proto/Thrift schema: 8 fields added (e.g. FetchAggregatedUserActionRequests.feature_switch_overrides, NextActionDistribution.rewardOutputs, RewardOutputs.policyLogits, RewardOutputs.values and 4 more).
  • Most activity in phoenix/ (+2,811/−536), home-mixer/ (+222/−25), grox/ (+146/−88) and visibility-filtering/ (+124/−2).

Full analysis → Summary: automatic analysis

· 11a71f8 · 14 files, +208/−70

New candidate hydrator vf_following_candidate_hydrator and other changes.

candidate hydratorsconstantsnumeric tweaks
  • New candidate hydrator: vf_following_candidate_hydrator.
  • Constants changed: FOLLOWER_COUNT_THRESHOLD_FOR_REPLY_RANKING 40000 → 60000 (task_filter.py).
  • Other literal values changed in code: FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 40000→60000 (task_filter.py), counts.get(&(1, pb::ServedType::ForYouPhoenixRetri 10→1 (author_cold_start.rs) and counts.get(&(2, pb::ServedType::ForYouPhoenixRetri 10→2 (author_cold_start.rs).
  • Most activity in home-mixer/ (+185/−42), grox/ (+8/−19), phoenix-rankall-strato/ (+12/−9) and visibility-filtering/ (+3/−0).

Full analysis → Summary: automatic analysis

· b089ce6 · 34 files, +751/−162

1 new config parameter and code changes in grox/, home-mixer/ and bdsm/.

constantsnumeric tweaksparams
  • Added 1 feature flag: EnableAdsBrandSafetyVerdictV2 (default off).
  • Constants changed: min_actions_for_enforcement 30 → 999999 (score_results_sink_focal.py), FOLLOWER_COUNT_THRESHOLD_FOR_REPLY_RANKING 30000 → 40000 (task_filter.py) and FOLLOWING_MAX_RESULT_SIZE 100 → 110 (config.rs).
  • Other literal values changed in code: version 13→14 (sink_policy.yaml), min_actions_for_enforcement 30→999999 (sink_policy.yaml), 2026-08-14: enforcement policy for the 8-head beha 13→14 (sink_policy.yaml) and FOLLOWER_COUNT_THRESHOLD_FOR_SPAM_DETECTION 30000→40000 (task_filter.py).
  • Most activity in grox/ (+375/−57), home-mixer/ (+276/−15), bdsm/ (+58/−33), phoenix-rankall-strato/ (+35/−44) and phoenix/ (+5/−13).

Full analysis → Summary: automatic analysis

· c65aa17 · 21 files, +2,271/−32

Brazil 2026 election filter; Thompson-sampling params for author cold start

constantsfiltersnumeric tweaksparams
  • New filter Brazil2026ElectionFilter (home-mixer/filters/brazil_2026_election_filter.rs). It removes a candidate when its author, the retweeted author, the quoted author, or any author in the reply's ancestor chain is on a hard-coded list of accounts reported to Brazil's Electoral Court, unless the viewer follows that account. The list starts with 665 user IDs, and code comments cite the TSE open-data candidate dataset. The upstream README's "August 14th, 2026" notes describe the same filter.
  • Author cold start: new params EnableColdStartThompsonSampling (default off), ColdStartBetaAlpha0 = 0.75, ColdStartBetaBeta0 = 49.25, ColdStartTsTopK = 5, ColdStartImpressionScale = 1.0 and ColdStartTrackedIds. These let the cold-start boost choose among eligible low-impression posts by sampling a Beta posterior of likes per impression, rather than taking the highest-scored one.
  • Comments added to home-mixer/params/param.rs explain that each weight multiplies the *predicted* probability of an action, not raw engagement counts. The README is restructured into a "Latest Updates" list with an August 14th entry.

Full analysis → Summary: hand-written notes, checked against the diff

· a389166 · 1 files, +0/−2

.gitattributes removed (Git LFS tracking for *.npz and *.zip)

Deletes the two-line .gitattributes that routed *.npz and *.zip files through Git LFS. No algorithm code changed.

Full analysis → Summary: hand-written notes, checked against the diff

· 47c1bcd · 2,053 files, +363,246/−11,640

Aug 13 release: ranking parameters, visibility filtering, labelers, Phoenix training code

ads blendersartifactsbotmaker rulescandidate hydratorscandidate sourcesconstantsfiltersnumeric tweaksparamsscorersselectorsside effects

The biggest drop in the repo's history (2,053 files, +363,246/−11,640). The upstream README's "August 13th, 2026" notes cover it.

  • Ranking configuration is now public. home-mixer/params/param.rs appears with 189 param! feature-switch defaults, including the action weights that blend predicted engagement probabilities into one score (for example ReplyWeight, ShareViaCopyLinkWeight and the negative ReportWeight/BlockAuthorWeight). See the parameter tracker on this site for how they've changed since.
  • Visibility filtering: visibility-filtering/ decides whether a post is shown, dropped, or shown behind an interstitial.
  • The systems that produce the labels it reads: rule engines (botmaker/, botmaker-rules/, scarecrow/), account-scoring models (agatha/, bdsm/, user-cred-v2/), media models (media-model-proxy/, clip/) and enforcement (abuse-enforcement-service/).
  • Phoenix: the demo model is replaced by the training code plus synthetic data generation.
  • SimClusters (simclusters/) is added as another out-of-network candidate source, alongside Thunder and Phoenix retrieval.
  • New home-mixer filters include ad_adjacent_served_filter, following_retweet_deduplication_filter, self_reply_chain_filter and oon_nsfw_simclusters_filter. See the full analysis for the complete list.
  • docs/BIDIRECTIONAL_BOOST_CHANGE.md is a worked example of a changelog. It walks through the July 2026 rollout of the bidirectional-follow reply boost (A/B tested at 5/10/15/20 from July 10, broadly launched at 20 on July 13, set to 15 on July 24) and says future updates will be published to the repo so readers "should be able to understand what changed by checking the diffs."

Full analysis → Summary: hand-written notes, checked against the diff

· 0bfc279 · 1 files, +2/−2

Phoenix model artifact re-uploaded (3.12 GB → 2.90 GB)

artifacts

The only change is the Git LFS pointer for phoenix/artifacts/oss-phoenix-artifacts.zip. The archive's recorded size drops from 3,123,149,995 to 2,903,518,802 bytes. No source code changed.

Full analysis → Summary: hand-written notes, checked against the diff

· e414c17 · 187 files, +18,263/−926

May 15 release: ads blending, Grox, more sources, hydrators and filters

ads blendersartifactscandidate hydratorscandidate sourcesfiltersnumeric tweaksscorersselectorsside effects

A large update (187 files, +18,263/−926). The upstream README gained an "Updates — May 15th, 2026" section for this release, which is no longer in the current README.

  • New candidate sources in home-mixer/sources/: ads_source, cached_posts_source, phoenix_moe_source, phoenix_topics_source, prompts_source, push_to_home_source, scored_posts_source, tweet_mixer_source and who_to_follow_source.
  • New scorers: ranking_scorer and vm_ranker (the original weighted_scorer, oon_scorer and author_diversity_scorer files are still present).
  • New filters: ancillary_vf_filter, new_user_topic_ids_filter, previously_seen_posts_backup_filter, topic_ids_filter and video_filter.
  • New selector: blender_selector, plus a new home-mixer/ads/ module for placing ads in the feed.
  • Adds the grox/ content-understanding service (classifiers, embedders, task engine) and many new query/candidate hydrators.
  • Phoenix gets a single run_pipeline.py entry point and a pre-trained mini model distributed through Git LFS (phoenix/artifacts/oss-phoenix-artifacts.zip, about 3.1 GB).

Full analysis → Summary: hand-written notes, checked against the diff

· aaa167b · 79 files, +8,816/−0

First public commit: Thunder, Phoenix and the Rust home-mixer

candidate hydratorscandidate sourcesfiltersscorersselectorsside effects

The first commit in the repository's history: 79 files across candidate-pipeline/, home-mixer/, phoenix/ and thunder/.

  • home-mixer/ is the service that assembles the For You feed. It ships with 12 filters (e.g. age_filter, author_socialgraph_filter, muted_keyword_filter, previously_seen_posts_filter, vf_filter), two candidate sources (thunder_source for in-network posts, phoenix_source for out-of-network retrieval) and four scorers: phoenix_scorer, weighted_scorer, author_diversity_scorer and oon_scorer.
  • thunder/ holds recent posts from followed accounts in memory; phoenix/ contains the retrieval/ranking model code.
  • candidate-pipeline/ is the generic source → hydrate → filter → score → select framework the feed is built on.

Full analysis → Summary: hand-written notes, checked against the diff