0x00 한

Research / Daily reports

  • Sources read: 1
  • Canon files updated: 1
  • Radar entries: 0
In one lineX stopped applying the rules that drop DoNotAmplify and malicious-URL-label posts from recommendation surfaces to the author's followers.

1Followers no longer fall under the label-post drop rules — X

Source xai-org/x-algorithm@cec6168 — xAI, 2026-11-12, code. In these notes' numbering, this is Gen4+62. Gen4+N is the number these notes assign, in order, to commits after the Gen4 release (2026-08-13).

Background X's For You (the home feed the algorithm picks) mixes in posts from accounts the user does not follow, that is, OON (out-of-network) candidates. For these recommendation candidates, VF (visibility filtering, a rule engine that drops or hides posts based on safety labels and relationships) applies a stricter rule set than for the Following feed. That set contained rules that drop posts carrying a DoNotAmplify (an internal safety label meaning "do not amplify") or malicious-URL label, and they applied to everyone except the author. This commit narrows the audience of these two rules to "viewers who do not follow the author" and cleans up several experiment mechanisms in the home feed and training code.

What we learnedA. The DoNotAmplify and malicious-URL drop rules no longer apply to followers

  • The audience of the two rules changed from "every viewer who is not the author" to "viewers who do not follow the author" verified — visibility-filtering/rules/tweet_rules.rs:930-942.

    • The field change replaces audience: NonAuthors with audience: NonFollowers.
    • The existing rule RISKY_HIGH_VIZ_REPLY_OON_DROP_UNSPECIFIED in the same set was already NonFollowers.
  • The two rules sit in the OON rule set of two safety levels for recommendation surfaces verified — rules/levels.rs:195-200.

    • The set is named OON_POST_DROPS, and TIMELINE_HOME_RECOMMENDATIONS and IMMERSIVE_EXPANDED_RECOMMENDATIONS use it.
    • The spam high-recall (SPAM_HIGH_RECALL) rule and the Brazil election rule in the same set did not change.
  • The golden corpus (a test table collecting the expected verdict for each input) that pins the expected verdicts also changed verified — rules/golden_corpus/oon_tweet_label.rs.

    Role::each([Role::NonFollower, Role::LoggedOut]) => dropped(PossiblyUndesirable, "malicious_url/drop/undesirable"),
    Role::each([Role::Follower, Role::Author])       => allow(),
    
  • If the follow-relationship lookup fails, the rules also apply to followers verified — rules/rule_spec/laws.rs.

    • This lookup is registered as best-effort (a lookup that does not stop the request when it fails). The registration comment states that the failure default drops the post even for actual followers.
  • In the home feed, the case actually affected is when a post from a followed author is judged at a recommendation level inferred.

    • The basis is that an OON candidate is by definition a post from an author the user does not follow. The canon records a rule that uses a stricter level for ancestor and quoted posts, but whether it was kept in Gen4 is an open question.

What we learnedB. The shuffled-history retrieval source added a day earlier was deleted

  • The source that shuffled the order of the user history and called Phoenix (X's Transformer-based retrieval and ranking model) retrieval one more time was removed together with its switch verified — commit diff.
    • The deleted items are home-mixer/sources/shuffled_history_phoenix_source.rs, the parameter EnableShuffledHistoryRetrieval, and a statistics function per served type.
    • This source was introduced as off by default in the 2026-11-10 commit (660cd74, Gen4+60) and was never on by default.

What we learnedC. The dismissal record of the Grok suggested-task card moved to a per-user store

  • When the card is served or the user closes it, the card is not inserted again for 6 hours by default, counted from that time verified — home-mixer/frames/catalog.rs:236-249.
    • Previously only the last impression time in the served history was checked. Now the expiry times of two keys, home.grokbot_suggested_tasks.served and home.grokbot_suggested_tasks, are stored in and read from Strato (X's internal data service).
    • The impression record is written only in production, by a new side effect FrameDismissalSideEffect.
  • A request whose dismissal record could not be read does not get the card verified — same file.
    • If frame_dismissals is None, is_none_or yields a hidden verdict. The test is named grokbot_suggested_tasks_frame_is_hidden_when_its_dismissal_could_not_be_read.
  • The card height constant changed from 0 to 433 verified — catalog.rs:87. The card switch is still off by default verified — params/param.rs:1252-1257.

What we learnedD. Phoenix training gained an option, off by default, that drops history right before the request

  • An option was added that drops, at a set rate, history rows inside a window right before the request in each training batch verified — phoenix/xrex/train/trainer_recsys.py.
    • The defaults are recent_history_dropout_rate=0.0 and recent_history_dropout_window_secs=900.
    • Rows with any of 10 explicit negative actions, such as report, not interested, show less, unfollow, block and mute, are not dropped. The list is EXPLICIT_NEGATIVE_ACTIONS in constants.py.
    • The number of history rows per user in the 15-minute, 30-minute, 1-hour, 2-hour and 1-day windows is logged as a training metric.
  • The shared serving-side crate also gained the same handling function, but no public code calls it verified — phoenix/crates/common/xai-recsys/src/util.rs.
    • The function is named InputBuffer::drop_recent_history.
  • We infer it is a device to simulate in training the situation where the newest part of the history arrives late at serving time inferred. The basis is that the rows to drop are limited to those right before the request and negative signals are kept.

What we learnedOther changes

  • An index event ai_video_model was added that collects immersive videos the content understanding model annotated as AI-generated. No serving request looks it up verified — phoenixRankAllCandidateProcessor.strato:383-423.
  • A device orientation (portrait or landscape) field was added to the client context of Phoenix requests, and IMMERSIVE_LONG_DWELL_GALLERY_3S to the history aggregation kinds verified — recsys.proto.
  • Experiment29Fou:0.3 and Experiment12Fou:0 were added to the shadow traffic (a path that sends only scoring to an experiment cluster and leaves the results only in logs) ratios verified — params/param.rs:93-108.
  • The extra candidate selection of the video carousel (a group of vertical videos inside For You, off by default) now copies candidates instead of moving them. The selection result is the same verified — util/video_carousel.rs.
  • A flag that keeps retrieval candidates only in debug requests, a shared dedup filter, and a 3,000-candidate benchmark test were added verified — commit diff.
  • VF also includes notification surface rule changes. A spam high-recall OON rule was added for media-tag notifications, and the quote, contact-sign-up and list-add notification kinds were added verified — rules/levels.rs.
  • The VF hydration layer and safety label cache code are mostly refactor. Small behavior differences are mixed in, such as a change that treats an account with a future creation time as a new account verified — commit diff.

Canon update In services/x.md ## Summary, the reference commit was raised to cec6168. The Grok suggested-task card sub-bullet in ## Feed surfaces was revised to reflect the dismissal approach. In the ## Candidate generation (retrieval) source table, the shuffled-history source row was removed and the detail bullet was changed to state the deletion. Under the TimelineHomeRecommendations bullet in the safety section, the change to the audience of the DoNotAmplify and malicious-URL rules was added. The option to drop recent history was added to the Phoenix training section, and the AI video model index to the retrieval index section. A Gen4+62 row was added to the verification reference and reference sha table and the change log summary table in ## Sources.

Why it matters X moved toward making the follow relationship an exception in label drop rules on recommendation surfaces. The basis is that the RiskyHighVizReply rule in the same set already excluded followers, and the two rules are now aligned to the same audience. The home feed changes are all cleanups of off-by-default features, so For You behavior does not change now.

What to check next