<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Recommendation-Systems on Moonment</title><link>https://moonment.net/en/tags/recommendation-systems/</link><description>Moon's notes on concepts, real projects, and reasoning open to review.</description><generator>Hugo</generator><language>en-US</language><managingEditor>Moon</managingEditor><webMaster>Moon</webMaster><copyright>© 2026 Moonment</copyright><lastBuildDate>Tue, 29 Sep 2026 13:55:00 +0800</lastBuildDate><atom:link href="https://moonment.net/en/tags/recommendation-systems/index.xml" rel="self" type="application/rss+xml"/><item><title>How X Ranks a Post: Predictions, Weights, and Filters</title><link>https://moonment.net/en/notes/x-algorithm-2026/</link><pubDate>Sat, 12 Sep 2026 22:03:10 +0800</pubDate><dc:creator>Moon</dc:creator><guid>https://moonment.net/en/notes/x-algorithm-2026/</guid><description>A source-level guide to X's Phoenix ranking pipeline at commit b089ce64—and why published weights are not an exchange rate for likes, replies, or shares.</description><content:encoded><![CDATA[<p>X’s published recommendation code does not describe a scoreboard in which a like is worth half a point and a reply is worth five. It describes a pipeline that estimates how a particular viewer might respond to a particular post, combines those predictions, and then applies additional filters and adjustments.</p>
<p>The distinction changes how the source should be read:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">published weight × predicted probability for this viewer
</span></span><span class="line"><span class="cl">≠ points awarded for an engagement that already happened
</span></span></code></pre></div><p>This article is pinned to commit <a href="https://github.com/xai-org/x-algorithm/commit/b089ce64891f9c50fab73aa00dbe65acb82f198f"><code>b089ce64</code></a>, dated 2026-08-17. It is a checkable source snapshot, not a claim about permanent production behavior.</p>
<h2 id="the-ranking-question-is-viewer-specific">The ranking question is viewer-specific</h2>
<p>A post does not have one universal relevance score before a viewer is considered. The system uses the viewer’s recent behavior and candidate features to predict several possible actions.</p>
<p>For one viewer, a technical thread may have a high predicted probability of a long dwell and a follow. For another, the same post may have low probabilities across every positive action. The content is unchanged; the predicted response differs.</p>
<p>This is the central object being ranked:</p>
<blockquote>
<p><strong>Not “How engaging is this post in general?” but “How is this viewer likely to respond to this candidate now?”</strong></p>
</blockquote>
<p>That is why raw engagement totals cannot fully explain distribution. Historical interactions help train or supply features, but the score in the inspected pipeline is built from predictions about the current viewer-candidate pair.</p>
<h2 id="candidates-arrive-from-different-networks">Candidates arrive from different networks</h2>
<p>The published architecture separates candidate sourcing from ranking.</p>
<ul>
<li><strong>In-network candidates</strong> come from accounts the viewer follows, with recent content served through Thunder.</li>
<li><strong>Out-of-network candidates</strong> come from accounts the viewer does not follow, surfaced through systems including Phoenix Retrieval and SimClusters.</li>
</ul>
<p>Candidates then enter Home Mixer. The pipeline filters them, hydrates features, scores them with Phoenix, and performs additional adjustments and selection.</p>
<p>This matters because ranking cannot promote a candidate that was never retrieved, and a high model score does not guarantee delivery if a later filter removes the post.</p>
<p>The official source describes the broader sequence in its <a href="https://github.com/xai-org/x-algorithm/blob/b089ce64891f9c50fab73aa00dbe65acb82f198f/README.md#system-architecture">System Architecture</a>.</p>
<h2 id="phoenix-predicts-several-actions-not-one-notion-of-engagement">Phoenix predicts several actions, not one notion of engagement</h2>
<p>The ranker estimates probabilities for multiple responses, including favorite, reply, retweet, direct-message share, copy-link share, dwell, following the author, and negative actions such as not-interested, block, mute, and report.</p>
<p>The source presents the scoring pattern as:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Final Score = Σ (weight_i × P(action_i))
</span></span></code></pre></div><p>Each term contains two parts:</p>
<ol>
<li>a predicted probability for this viewer and candidate;</li>
<li>a configurable weight expressing how strongly that predicted action contributes to the score.</li>
</ol>
<p>The score is therefore sensitive both to the model’s estimate and to product-level parameter choices.</p>
<h2 id="why-the-public-weights-are-not-an-exchange-rate">Why the public weights are not an exchange rate</h2>
<p>At the inspected commit, notable defaults include:</p>
<table>
  <thead>
      <tr>
          <th>Predicted action</th>
          <th style="text-align: right">Published default</th>
          <th>What the number applies to</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Favorite</td>
          <td style="text-align: right">0.5</td>
          <td>Predicted probability that this viewer favorites</td>
      </tr>
      <tr>
          <td>Retweet</td>
          <td style="text-align: right">1.0</td>
          <td>Predicted probability that this viewer retweets</td>
      </tr>
      <tr>
          <td>Reply</td>
          <td style="text-align: right">5.0</td>
          <td>Predicted probability that this viewer replies</td>
      </tr>
      <tr>
          <td>Direct-message share</td>
          <td style="text-align: right">5.0</td>
          <td>Predicted probability of a DM share</td>
      </tr>
      <tr>
          <td>Copy-link share</td>
          <td style="text-align: right">20.0</td>
          <td>Predicted probability of copying the link</td>
      </tr>
      <tr>
          <td>Follow author</td>
          <td style="text-align: right">4.0</td>
          <td>Predicted probability of following the author</td>
      </tr>
      <tr>
          <td>Report</td>
          <td style="text-align: right">−234.0</td>
          <td>Predicted probability of reporting</td>
      </tr>
  </tbody>
</table>
<p>A copy-link weight of <code>20</code> and favorite weight of <code>0.5</code> do not imply that one copied link equals forty likes. The two values multiply different probabilities, and those probabilities vary by viewer and candidate.</p>
<p>Likewise, a report weight of <code>−234</code> does not mean one observed report cancels 468 observed likes. Reports are rare, so a model may assign a very small report probability. The contribution is the product, not the coefficient alone.</p>
<p>The relevant defaults can be inspected in <a href="https://github.com/xai-org/x-algorithm/blob/b089ce64891f9c50fab73aa00dbe65acb82f198f/home-mixer/params/param.rs"><code>home-mixer/params/param.rs</code></a>.</p>
<h2 id="ranking-is-followed-by-constraints-and-adjustments">Ranking is followed by constraints and adjustments</h2>
<p>The model score is not the last word. The published pipeline also includes mechanisms that affect which posts survive and where they appear.</p>
<p>Examples in the snapshot include:</p>
<ul>
<li>author-diversity decay, which reduces repeated concentration from one author;</li>
<li>an out-of-network discount;</li>
<li>new-author exploration;</li>
<li>removal of duplicates and already-seen posts;</li>
<li>age thresholds;</li>
<li>visibility and safety filtering;</li>
<li>final selection and ordering.</li>
</ul>
<p>This explains why a strategy based only on maximizing one predicted action is incomplete. A post can score well and still be affected by author repetition, age, network source, or filtering.</p>
<p>It also explains why publishing near-identical posts in quick succession does not stack distribution linearly. Later candidates from the same author can be discounted even before audience fatigue is considered.</p>
<h2 id="relationship-signals-are-conditional">Relationship signals are conditional</h2>
<p>The inspected defaults include an additional reply-weight boost for original posts from mutually followed authors. That is evidence that relationship context can enter ranking.</p>
<p>It is not evidence that bulk mutual-following guarantees reach. The branch applies under specific conditions, and the predicted reply probability still matters. Replies and retweets are not automatically treated as original posts from a mutually followed author.</p>
<p>The correct inference is narrow:</p>
<blockquote>
<p>Existing reciprocal relationships can change how some original posts are scored in this source snapshot.</p>
</blockquote>
<p>Anything stronger would require production experiments or observed account-level outcomes.</p>
<h2 id="what-a-creator-can-test">What a creator can test</h2>
<p>The source suggests hypotheses, not guaranteed tactics.</p>
<h3 id="audience-match">Audience match</h3>
<p>If scoring is viewer-specific, a clear topic and recognizable audience should help the system connect a post with people likely to respond. This can be tested by comparing follower conversion, profile visits, and the quality of replies across topic-consistent and topic-ambiguous posts.</p>
<h3 id="high-intent-actions">High-intent actions</h3>
<p>Copying a link, sending a direct message, or following an author has meaningful published weight in the snapshot. A creator can test whether practical references, reusable explanations, or distinctive original work produce these actions naturally.</p>
<h3 id="author-repetition">Author repetition</h3>
<p>Author-diversity decay predicts diminishing value from placing several similar candidates into the same window. A creator can compare spaced, distinct posts with rapid near-duplicates while keeping topic and audience as stable as possible.</p>
<h3 id="negative-feedback">Negative feedback</h3>
<p>Large negative coefficients indicate that the system is designed to react strongly to predicted dissatisfaction. Conflict can produce replies while also increasing blocks, mutes, reports, or “not interested” signals. Counting visible comments alone cannot resolve the net effect.</p>
<p>These are experiments to run, not results already established for a specific account.</p>
<h2 id="what-the-repository-cannot-prove">What the repository cannot prove</h2>
<p>The public code does not establish:</p>
<ul>
<li>which experimental parameter values production currently uses;</li>
<li>how models were trained or calibrated in every production environment;</li>
<li>the causal effect of a tactic on a particular account;</li>
<li>whether an observed reach change came from content, audience, timing, competition, or an unobserved system change;</li>
<li>how long the inspected defaults will remain current.</li>
</ul>
<p>The repository is strong evidence about published architecture and defaults at a commit. It is weaker evidence about live production configuration and individual creator outcomes.</p>
<p>The most defensible conclusion is therefore architectural:</p>
<blockquote>
<p><strong>X’s published pipeline ranks predicted viewer responses, then subjects candidates to further adjustments and filters. The weights describe coefficients inside that system, not a universal price list for engagement.</strong></p>
</blockquote>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://github.com/xai-org/x-algorithm/tree/b089ce64891f9c50fab73aa00dbe65acb82f198f">xai-org/x-algorithm at commit b089ce64</a></li>
<li><a href="https://github.com/xai-org/x-algorithm/blob/b089ce64891f9c50fab73aa00dbe65acb82f198f/README.md#system-architecture">System Architecture</a></li>
<li><a href="https://github.com/xai-org/x-algorithm/blob/b089ce64891f9c50fab73aa00dbe65acb82f198f/README.md#scoring-and-ranking">Scoring and Ranking</a></li>
<li><a href="https://github.com/xai-org/x-algorithm/blob/b089ce64891f9c50fab73aa00dbe65acb82f198f/home-mixer/params/param.rs">Published Home Mixer parameters</a></li>
</ul>
]]></content:encoded></item></channel></rss>