--- name: x-algo-engagement description: Reference for X algorithm engagement types and signals. Use when analyzing engagement metrics, action predictions, or understanding what signals the algorithm tracks. --- # X Algorithm Engagement Signals The X recommendation algorithm tracks **18 engagement action types** plus **1 continuous metric**. These are predicted by the Phoenix ML model and used to calculate weighted scores. ## PhoenixScores Struct Defined in `home-mixer/candidate_pipeline/candidate.rs`: ```rust pub struct PhoenixScores { // Positive engagement signals pub favorite_score: Option, pub reply_score: Option, pub retweet_score: Option, pub quote_score: Option, pub share_score: Option, pub share_via_dm_score: Option, pub share_via_copy_link_score: Option, pub follow_author_score: Option, // Engagement metrics pub photo_expand_score: Option, pub click_score: Option, pub profile_click_score: Option, pub vqv_score: Option, // Video Quality View pub dwell_score: Option, pub quoted_click_score: Option, // Negative signals pub not_interested_score: Option, pub block_author_score: Option, pub mute_author_score: Option, pub report_score: Option, // Continuous actions pub dwell_time: Option, } ``` ## Action Types by Category ### Positive Engagement (High Value) | Action | Proto Name | Description | | ----------------- | ------------------------- | ----------------------------------- | | **Favorite** | `ServerTweetFav` | User likes the post | | **Reply** | `ServerTweetReply` | User replies to the post | | **Retweet** | `ServerTweetRetweet` | User reposts without comment | | **Quote** | `ServerTweetQuote` | User reposts with their own comment | | **Follow Author** | `ClientTweetFollowAuthor` | User follows the post's author | ### Sharing Actions | Action | Proto Name | Description | | ----------------------- | -------------------------------------- | ------------------------------------ | | **Share** | `ClientTweetShare` | Generic share action | | **Share via DM** | `ClientTweetClickSendViaDirectMessage` | User shares via direct message | | **Share via Copy Link** | `ClientTweetShareViaCopyLink` | User copies link to share externally | ### Engagement Metrics | Action | Proto Name | Description | | ----------------- | ----------------------------- | --------------------------------------------------------------- | | **Photo Expand** | `ClientTweetPhotoExpand` | User expands photo to view | | **Click** | `ClientTweetClick` | User clicks on the post | | **Profile Click** | `ClientTweetClickProfile` | User clicks author's profile | | **VQV** | `ClientTweetVideoQualityView` | Video Quality View - user watches video for meaningful duration | | **Dwell** | `ClientTweetRecapDwelled` | User dwells (pauses) on the post | | **Quoted Click** | `ClientQuotedTweetClick` | User clicks on a quoted post | ### Negative Signals | Action | Proto Name | Description | | ------------------ | ---------------------------- | ---------------------------- | | **Not Interested** | `ClientTweetNotInterestedIn` | User marks as not interested | | **Block Author** | `ClientTweetBlockAuthor` | User blocks the author | | **Mute Author** | `ClientTweetMuteAuthor` | User mutes the author | | **Report** | `ClientTweetReport` | User reports the post | ### Continuous Actions | Action | Proto Name | Description | | -------------- | ----------- | -------------------------------------------- | | **Dwell Time** | `DwellTime` | Continuous value: seconds spent viewing post | ## How Scores Are Obtained The `PhoenixScorer` (`home-mixer/scorers/phoenix_scorer.rs`) calls the Phoenix prediction service: 1. **Input**: User history + candidate posts 2. **Output**: Log probabilities for each action type per candidate 3. **Conversion**: `probability = exp(log_prob)` ```rust fn extract_phoenix_scores(&self, p: &ActionPredictions) -> PhoenixScores { PhoenixScores { favorite_score: p.get(ActionName::ServerTweetFav), reply_score: p.get(ActionName::ServerTweetReply), retweet_score: p.get(ActionName::ServerTweetRetweet), // ... maps each action to its probability } } ``` ## Signal Interpretation - **Scores are probabilities** (0.0 to 1.0): P(user takes action | user sees post) - **Higher = more likely**: A `favorite_score` of 0.15 means 15% predicted chance of like - **Negative signals have negative weights**: High `report_score` reduces overall ranking - **VQV requires minimum video duration**: Only applies to videos > `MIN_VIDEO_DURATION_MS` ## Related Skills - `/x-algo-scoring` - How these signals are combined into a weighted score - `/x-algo-ml` - How Phoenix model predicts these probabilities